1. Introduction

Simms Creek is a small, 3rd order stream that drains an area of ~1,800 ha into the Salish Sea, near Campbell River’s Willow Point neighborhood. The lower reach of Simms Creek (~3 km of channel, east of Dogwood Street), is contained within a narrow urban green way that is bordered by residential properties. From Dogwood Street Road the streams runs for ~ 2 km to the Inland Highway and is protected within Beaver Lodge Lands, upstream of the Inland Highway, >1.5 km of tributary channel is located within private forest lands in various stages of regeneration.

Chum, Chinook, Pink and Coho salmon have all been observed in Simms Creek, as well as Coastal Cutthroat Trout (CCT), Rainbow Trout and steelhead. More recent monitoring (i.e., this dataset), suggest that Coho Salmon (CO) and CCT are the primary species within Simms Creek, both of which are present within the stream year round - though a small number of juvenile Chinook Salmon were identified in 2024.

Greenways Land Trust has supported Simms Creek Stewards for +20 years, including operation of a fish fence near the mouth of the stream since 2008. Juvenile and adult fish moving past the fence are tallied each spring and fall, respectively. The objective of this project is to explore the juvenile fence dataset. All work is being done strictly for fun and out of personal curiosity. Any feedback, input, or support is welcome. Also, I have a soft spot for CCT, so be warned that effort and results will be slightly trout biased. Let’s take a look at what has been completed to date. It’s a tremendous amount of work and all volunteers and supporters should be commended!

2. Fence Operation

2.1. Monitoring Effort

The Simms Creek fish fence has operated annually since 2008, with the exception of 2020 and 2021 when operations were paused due to the COVID-19 Pandemic and in the spring of 2023 when federal employees were on strike.

Spring surveys target out migrating juvenile Coho Salmon but also capture an impressive number of CCT and have even captured some Chinook Salmon. Spring fence monitoring has started as early as April 03, however, most surveys (50%) don’t start until April 18. In each monitoring year, the fence has operated continuously (e.g., sampling occurred at least daily) from April 28 to May 30. Surveys have continued as late as June 13, but most (50%) are terminated by June 06.

Fall surveys to count the number returning adult Coho, Chinook, Chum and Pink Salmon and also intercept a small number of CCT. In the fall, surveys have started as early as September 26, however, most surveys (50%) have started on October 08. In each monitoring year, surveys have occurred continuously (e.g., sampling occurred daily) from October 23 to November 16. Surveys have continued as late as December 10 and no surveys have occurred later than December 02.

Monitoring Effort Tables and Figures

Table 1. Sampling Summary

Table 2. Annual Spring and Fall Trap Operation Periods

Table 2. Annual spring and fall trap operation periods.
Spring Sampling
Fall Sampling
Year # Days Sampled Start End # Days Sampled Start End
2008 41 Apr-21 May-31 40 Oct-14 Nov-22
2009 50 Apr-19 Jun-07 40 Oct-14 Nov-22
2010 42 Apr-19 May-30 35 Oct-23 Nov-26
2011 49 Apr-19 Jun-06 46 Oct-18 Dec-02
2012 50 Apr-16 Jun-04 50 Oct-14 Dec-02
2013 49 Apr-14 Jun-01 62 Sep-29 Dec-01
2014 45 Apr-24 Jun-07 58 Oct-04 Nov-30
2015 52 Apr-10 May-31 62 Oct-08 Dec-08
2016 63 Apr-03 Jun-04 60 Oct-07 Dec-05
2017 68 Apr-05 Jun-11 56 Oct-11 Dec-05
2018 52 Apr-21 Jun-11 58 Oct-08 Dec-04
2019 51 Apr-18 Jun-07 64 Oct-08 Dec-10
2020 0 COVID - 0 - -
2021 0 COVID - 0 - -
2022 47 Apr-28 Jun-13 37 Oct-11 Nov-16
2023 0 DFO Strike - 45 Sep-26 Nov-17
2024 55 Apr-12 Jun-05 0 - -

2.2 Stream Conditions

During each daily trap visit, volunteers record measures of water temperature, pH, Total Suspended Sediment (TSS), dissolved oxygen, and water level (stage). Mean annual measures of each parameter are presented below for the spring and fall monitoring periods (Table 3 and Table 4, Figure 2).

Stream Conditions Figures and Tables

Table 3. Spring Condition Table

Table 3. Stream conditions during spring trap operation.
Year
Spring Monitoring
Air Temp.
(°C)
Water Temp.
(°C)
pH
.
DO
(mg/L)
TDS
(ppm)
Water Level
(m)
Mean SD Mean SD Mean SD Mean SD Mean SD Mean SD
2008 9.5 4.0 10.5 2.8 7.1 0.3 10.8 0.8 67.8 36.8 0.2 0.0
2009 11.8 3.0 10.3 2.4 7.1 0.2 10.3 0.8 136.4 26.2 0.3 0.0
2010 9.5 2.2 10.0 1.6 8.2 0.3 10.5 1.8 110.2 17.4 0.2 0.1
2011 9.8 2.3 9.8 2.1 6.7 0.3 9.1 1.0 95.5 11.7 0.2 0.0
2012 11.0 2.1 10.2 1.7 7.4 0.8 9.9 1.4 99.4 17.2 0.2 0.1
2013 10.3 2.9 10.1 2.0 7.9 0.3 11.5 0.9 100.6 14.9 0.2 0.1
2014 12.2 2.4 11.3 1.7 8.1 0.5 9.7 0.6 97.8 19.2 0.2 0.1
2015 10.5 3.4 11.0 2.5 8.1 0.2 9.4 0.8 106.7 22.2 0.2 0.4
2016 11.4 2.8 11.7 1.8 7.1 0.4 10.2 1.5 111.3 20.1 0.1 0.0
2017 9.6 3.0 10.2 2.3 8.2 0.4 10.9 2.2 77.8 25.6 0.3 0.1
2018 10.7 2.5 8.7 1.3 8.8 1.4 14.2 1.6 153.9 21.2 0.1 0.0
2019 11.2 2.7 11.9 2.3 8.0 0.2 8.6 0.7 129.0 25.7 0.1 0.1
2022 11.7 2.5 12.2 16.0 7.5 0.3 - - 83.0 17.2 0.2 0.1
2023 - - - - - - - - - - - -
2024 12.1 2.2 10.3 2.1 7.7 0.4 10.2 0.9 129.8 30.0 0.1 0.0

Table 4. Fall Condition Table

Table 4. Stream conditions during fall trap operation.
Year
Fall Monitoring
Air Temp.
(°C)
Water Temp.
(°C)
pH
.
DO
(mg/L)
TDS
(ppm)
Water Level
(m)
Mean SD Mean SD Mean SD Mean SD Mean SD Mean SD
2008 6.3 3.0 8.8 1.3 7.3 0.4 10.5 0.4 120.2 30.9 0.4 0.1
2009 6.8 3.3 8.7 1.9 7.6 0.2 10.6 1.9 105.0 28.7 0.5 0.2
2010 4.9 4.7 7.9 2.7 7.0 0.2 9.5 0.9 110.9 31.1 0.6 0.9
2011 4.9 3.0 7.0 1.8 7.3 0.6 9.7 0.5 112.7 30.1 0.3 0.3
2012 5.9 3.2 7.8 1.7 7.5 0.2 10.8 1.6 116.1 29.6 0.4 0.2
2013 6.1 3.1 8.0 2.0 7.7 0.1 10.5 0.7 119.8 30.6 0.3 0.1
2014 7.3 5.0 9.6 3.2 7.9 0.2 10.0 1.2 85.3 29.8 0.3 0.1
2015 6.0 4.3 8.5 3.0 8.2 0.2 10.2 2.1 97.1 29.5 0.3 0.2
2016 7.8 3.1 9.3 1.8 8.1 1.3 9.3 1.3 54.0 9.2 0.5 0.2
2017 4.8 3.3 8.4 1.9 8.1 0.7 12.8 1.4 101.8 38.2 0.3 0.2
2018 6.4 3.5 9.2 1.9 7.9 0.3 10.4 0.6 88.8 29.0 0.3 0.1
2019 5.2 3.8 8.2 2.3 7.6 0.1 11.5 1.0 103.9 26.6 0.2 0.1
2022 6.9 4.9 8.4 2.5 7.8 0.2 10.1 - 126.9 83.3 0.2 0.6
2023 8.3 5.4 9.6 2.4 7.8 0.2 10.7 0.7 66.4 66.1 0.2 0.1
2024 - - - - - - - - - - - -

Figure 2. Spring and Fall Condition Plot

2.3. Annual Captures

Since 2008, a total of 5,046 juvenile CCT and 8,216 juvenile Coho Salmon have been captured during spring trapping. Annual captures of CCT have ranged from 45 to 849 (mean = 360) while CO captures have varied from 335 to 913 with an overall mean of 587 fish (Figure 3 and Figure 4, Table 5 and Table 6).

As expected, most fish are captured in the Spring. Catches of CCT have ranged from 45 to 849 during spring (mean = 360 \(\pm\) 276.5) compared to only 1 to 9 fish during fall (mean = 2 \(\pm\) 2.8).

Annual Captures Figures and Tables

Figure 3. Spring - Total annual catches

Table 5. Spring - Total annual catches

**Table 5. Spring capture summary - capture timing, total captures and length of CCT and Coho Salmon.**
CCT
Coho Salmon
Total
Sample Period
Capture Timing
Fork Length (mm)
Capture Timing
Fork Length (mm)
(CT+CO)
Year Start End # Days Sampled Med. Min Max n Mean SD Min Max Med. Min Max n Mean SD Min Max n
2008 Apr-21 May-31 41 May-20 Apr-21 May-31 756 139.1 27.6 90 280 May-17 Apr-25 May-31 512 118.1 10.7 84.0 150 1268
2009 Apr-19 Jun-07 50 May-16 Apr-20 Jun-03 225 163.3 22.9 115 265 May-20 Apr-24 Jun-07 658 100.2 11.0 11.0 160 883
2010 Apr-19 May-30 42 May-13 Apr-19 May-29 502 149.7 26.1 110 285 May-13 Apr-20 May-30 477 118.0 15.7 80.0 183 979
2011 Apr-19 Jun-06 49 May-15 Apr-23 Jun-05 624 155.3 32.5 95 400 May-17 Apr-20 Jun-06 602 113.1 12.8 80.0 147 1226
2012 Apr-16 Jun-04 50 May-08 Apr-23 Jun-01 465 160.1 33.7 80 335 May-13 Apr-16 Jun-04 689 107.8 12.4 75.0 145 1154
2013 Apr-14 Jun-01 49 May-09 Apr-16 May-30 461 161.4 26.5 95 350 May-12 Apr-15 Jun-01 913 106.7 9.9 83.0 150 1374
2014 Apr-24 Jun-07 45 May-09 Apr-27 Jun-02 76 142.1 29.2 70 310 May-12 Apr-26 Jun-05 376 103.2 12.4 80.0 223 452
2015 Apr-10 May-31 52 May-09 Apr-15 May-28 141 158.1 37.4 85 260 May-13 Apr-11 May-31 761 109.3 11.7 78.0 152 902
2016 Apr-03 Jun-04 63 Apr-26 Apr-05 May-15 77 147.5 37.4 88 250 May-05 Apr-05 Jun-04 817 108.0 13.4 0.0 162 894
2017 Apr-05 Jun-11 68 May-24 Apr-20 Jun-09 65 185.1 64.0 120 470 May-20 Apr-05 Jun-11 335 113.4 12.8 80.0 162 400
2018 Apr-21 Jun-11 52 May-04 Apr-26 May-27 45 167.4 28.2 120 230 May-19 Apr-21 Jun-11 647 101.4 11.1 9.0 170 692
2019 Apr-18 Jun-07 51 May-06 Apr-18 May-30 571 146.1 27.6 95 260 May-13 Apr-24 Jun-05 405 115.4 12.9 10.7 152 976
2022 Apr-28 Jun-13 47 May-19 Apr-29 Jun-13 189 168.5 33.6 98 430 May-21 Apr-28 Jun-10 366 113.7 13.0 80.0 170 555
2024 Apr-12 Jun-05 55 Apr-29 Apr-17 Jun-03 849 159.8 37.1 50 360 May-10 Apr-18 Jun-04 658 97.5 17.6 48.0 174 1507

Figure 4. Fall - Total annual catches

Table 6. Fall - Total annual catches

**Table 6. Fall capture summary - capture timing, total captures and length of CCT and Coho Salmon.**
CCT
Coho Salmon
Sample Period
Capture Timing
Fork Length (mm)
Capture Timing
Fork Length (mm)
Year Start End # Days Sampled Med. Min Max n Mean SD Min Max Med. Min Max n Mean SD Min Max
2008 Oct-14 Nov-22 40 Nov-03 Nov-03 Nov-03 1 440.0 - 440 440 Nov-02 Oct-31 Nov-03 5 638.0 78.9 540 720
2009 Oct-14 Nov-22 40 - - - 0 - - - - Nov-03 Oct-17 Nov-18 12 648.3 84.1 490 790
2010 Oct-23 Nov-26 35 Nov-11 Nov-11 Nov-11 1 290.0 - 290 290 Oct-25 Oct-24 Nov-22 37 640.1 91.5 405 780
2011 Oct-18 Dec-02 46 - - - 0 - - - - Nov-12 Oct-26 Nov-23 30 650.5 82.9 370 795
2012 Oct-14 Dec-02 50 Oct-28 Oct-28 Oct-28 1 580.0 - 580 580 Nov-01 Oct-14 Nov-20 17 583.2 107.1 300 690
2013 Sep-29 Dec-01 62 - - - 0 - - - - Nov-06 Nov-02 Nov-18 83 631.7 59.7 490 790
2014 Oct-04 Nov-30 58 Oct-28 Oct-28 Oct-28 1 430.0 - 430 430 Oct-28 Oct-15 Nov-27 91 627.8 87.8 330 830
2015 Oct-08 Dec-08 62 - - - 0 - - - - Nov-08 Oct-12 Dec-02 77 600.0 89.4 350 750
2016 Oct-07 Dec-05 60 - - - 0 - - - - Nov-01 Oct-24 Nov-17 9 632.8 77.9 510 750
2017 Oct-11 Dec-05 56 Nov-19 Nov-19 Nov-19 1 470.0 - 470 470 Nov-15 Oct-18 Dec-04 19 592.4 133.3 330 770
2018 Oct-08 Dec-04 58 Nov-01 Nov-01 Nov-01 1 330.0 - 330 330 Nov-14 Oct-26 Nov-28 25 605.5 91.0 380 790
2019 Oct-08 Dec-10 64 Oct-16 Oct-16 Oct-16 1 390.0 - 390 390 Oct-25 Oct-16 Nov-17 22 566.8 110.2 340 710
2022 Oct-11 Nov-16 37 - - - 0 - - - - Nov-03 Oct-24 Nov-06 125 612.7 97.5 220 750
2023 Sep-26 Nov-17 45 Nov-02 Nov-02 Nov-16 9 239.1 108.9 152 430 Oct-18 Oct-11 Nov-16 272 571.3 96.5 220 740

2.4 Length Frequency

The length frequency figures shown below shed light on the population structure and behaviours of Coho Salmon and CCT in Simms Creek. The lengths of CCT (50 mm to 223 mm) and Coho Salmon (48 mm to 223 mm) measured at the fence suggest multiple age classes of juveniles are moving out of the system each spring. Assuming that CO <100 mm are Age 0 and CO >100 mm are Age 1 would suggest that 55.20% of all overall migrants are Age 0 and the remainder are Age 1. A wider range of age classes is likely present among CCT, including Age 0 fish (~<80 mm) up to mature fish > 230 mm and upwards of 3+ years.

Mature CCT >230 mm represent <1.90% of the total catch of CCT. However, all mature CCT >230 mm were moving downstream, suggesting that they either 1) moved upstream and spawned prior to the start of fence operation or 2) had overwintered in Simms Creek and were follow fry out in the spring - whether this was their first movement to the ocean is unknown.

Length Frequency Table and Figures

Figure 5. Length Frequency of all CCT

Figure 6. Length frequency of Coastal CCT across years.

Figure 7. Length frequency of all Coho Salmon.

Figure 8. Length frequency of Coho Salmon across years.

2.5 Age Composition

No scale data has been collected during juvenile enumeration work on Simms Creek. However, information collected on systems within the region suggests we can loosely apply the following age classes to juvenile CT and CO:

  • CT < 80 ~ Age-0
  • CT < 120 ~ Age-1
  • CT < 200 ~ Age-2
  • CT > 200 ~ Age-2+
  • CO < 80 ~ Age-0
  • CO < 120 ~ Age-1
  • CO > 120 ~ Age-1+

Applying these age bins to the length frequency data suggests that CCT are range in age from Age-1 to Age 3+, but are primarily Age-2 (Figure 9), while CO are almost exclusively Age-1 (Figure 10). Interestingly, Age-0 CO were present in 2009 and 2024, but not other years. While this may be coincidental, it’s worth noting that the peak juvenile CCT counts were recorded in 2008 and 2024. There are a number of mechanisms that may explain why Age-0 CO were first observed in 2024: 1) they weren’t recorded in past years, CO emigrated out of Simms Creek earlier than normal due to high CT abundance.

Figure 9. Age composition across years.

Figure 10. Size by age class across years.

2.6. Migration Timing

2.4.1 Spring Outmigration

Outmigrating juvenile CCT and Coho Salmon were first encountered at the trap over a similar period, from October 16 to November 19 (mean \(\pm\) SD = November 01 \(\pm\) 10.1 days) for CCT and October 11 to November 02 for Coho (mean \(\pm\) SD = October 20 \(\pm\) 7 days). On average 50% of all CCT had passed the fence by November 02\(\pm\) 10.1 days while half of Coho Salmon migrants had passed the fence by November 05\(\pm\) 8 days. Despite similarities in when migrations started and the timing that most migrants had past the fence, there was a noticeable difference in the timing of peak migrations (the date when the greatest number of fish passed the fence). For Coastal CCT, the overall mean \(\pm\) SD peak migration occurred on November 01(\(\pm\) 10.1 days) (Figure 5) whereas overall mean peak Coho Salmon migration occurred more than a week later on October 30 (\(\pm\) 11.4 days) (Figure 6). Total number of daily captures of CCT and Coho Salmon per year are presented in Figure 6 and Figure 7, respectively.

2.4.2 Fall Return Timing

Adult Coho Salmon have been detected at the fence as early as October 11 and as late as November 02, though most of the run (50%) arrive within a week of November 05 (Figure 14 to 19). Relative to spring sampling, CCT are encountered less frequently in the fall and arrival timing appears to be considerably more variable (Figure 20 to 22).

Spring and Fall Migration Timing Tables and Figures

Figure 11. Spring - Overall Capture Timing

Figure 12. Spring - Daily captures of CCT per year

Figure 13. Spring - Total daily captures of Coho Salmon per year

Figure 14. Fall - Total daily captures of Coho Salmon per year

Figure 15. Fall - Daily captures of CCT per year

2.6 What are these fish doing???

CCT show incredible diversity in the timing of their life history behaviours. Throughout their range, spawning has been documented in nearly every month of the year. In Puget Sound for instance, spawning has been reported from November through March and timing is highly variable between years (Losee et al. 2016). The spawn timing of CCT in Simms Creek is unknown, or at least undocumented, however, I would assume it occurs during a similar period to Puget Sound and is equally variable.

The current dataset does provide some insight on spawn timing. Presumably, spawners will be >150 mm in length.

FINISH WRITING THIS SECTION

3. Survival

3.1 What may be driving juvenile abundance

{ 9. Survival, echo = FALSE, warning = FALSE, message = FALSE, include = FALSE} source("SourceFiles/9. Survival.R")

To estimate the number of Coho Salmon that survive from egg to fry, we need to make a number of assumptions:

- All adult Coho Salmon that enter Simms Creek and all juvenile Coho Salmon that outmigrate from Simms Creek are enumerated.  
- All adult Coho Salmon that pass the fence will successfully spawn.
- The sex ratio of adults is equal (50% are female, excluding jacks which are assumed male).
- Each female will deposit ~2,600 eggs.

Importantly, we also need to consider the proportion of juveniles from each age-class the emigrate each year (and assume juvenile age assignments are accurate). Fish that outmigrate as Age-0 fry will be progeny of fish that spawned the previous fall, while fish that emigrate at Age-1 would have spent a full year in the stream (i.e., spawned 2 falls previous) and Age-1+ fish would have spawned 3 years previous. Using this information, we can then calculate the total number of juveniles produced by each spawning event to calculate egg-to-fry survival.

3.2 What about marine survival (from smolt to spawn)

Additional assumptions are required to estimate the number of juveniles that survive to return as adults:

- Adults spend ~18-20 months at sea (1 winter), regardless of whether they leave Simms Creek as Age-0 or Age-1.
- Jacks return to Simms Creek after ~6-8 months at sea (0 winters). 
- All Coho Salmon that are enumerate at the fence originated from Simms Creek (i.e., there are no hatchery fish or strays from neighbouring streams).

##————————–

##————————–

3. Fall Fence Operation

3.1. Monitoring Effort

LS0tDQp0aXRsZTogIlNpbW1zRmlzaEZlbmNlIg0KYXV0aG9yOiAiRXJpYyBWIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogZmxhdGx5ICMgZGVmYXVsdCwgY2VydWxlYW4sIGpvdXJuYWwsIGZsYXRseSwgZGFya2x5LCByZWFkYWJsZSwgc3BhY2VsYWIsIHVuaXRlZCwgY29zbW8sIGx1bWVuLCBwYXBlciwgc2FuZHN0b25lLCBzaW1wbGV4LCBhbmQgeWV0aQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gIyBkZWZhdWx0LCB0YW5nbywgcHlnbWVudHMsIGthdGUsIG1vbm9jaHJvbWUsIGVzcHJlc3NvLCB6ZW5idXJuLCBoYWRkb2NrLCBicmVlemVkYXJrLCBhbmQgdGV4dG1hdGUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGNvZGVfZm9sZGVyOiBzaG93DQogICAgc21hcnQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgdG9jX2RlcHRoOiAxDQogIGZsZXhkYXNoYm9hcmQ6OmZsZXhfZGFzaGJvYXJkOg0KICAgIG9yaWVudGF0aW9uOiBjb2x1bW5zDQogICAgdmVydGljYWxfbGF5b3V0OiBzY3JvbGwgDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMgIA0KDQoNCiNiaWJsaW9ncmFwaHk6IGJpb2JsaW9ncmFwaHkuYmliDQogICAgDQotLS0NCg0KYGBge3Igb2xkIHlhbWwsIGluY2x1ZGUgPSBGQUxTRX0NCg0KDQojIDwhLS0gICBmbGV4ZGFzaGJvYXJkOjpmbGV4X2Rhc2hib2FyZDogLS0+DQojIDwhLS0gICAgIG9yaWVudGF0aW9uOiBjb2x1bW5zIC0tPg0KIyA8IS0tICAgICB2ZXJ0aWNhbF9sYXlvdXQ6IHNjcm9sbCAtLT4NCiMgPCEtLSAgIGh0bWxfbm90ZWJvb2s6IC0tPg0KIyA8IS0tICAgICB0b2M6IHRydWUgLS0+DQojIDwhLS0gICB3b3JkX2RvY3VtZW50OiAtLT4NCiMgPCEtLSAgICAgdG9jOiB0cnVlIC0tPg0KIyA8IS0tIGVkaXRvcl9vcHRpb25zOiAtLT4NCiMgPCEtLSAgIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUgLS0+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQ0KDQpgYGANCg0KIyAxLiBJbnRyb2R1Y3Rpb24NCg0KU2ltbXMgQ3JlZWsgaXMgYSBzbWFsbCwgM3JkIG9yZGVyIHN0cmVhbSB0aGF0IGRyYWlucyBhbiBhcmVhIG9mIFx+MSw4MDAgaGEgaW50byB0aGUgU2FsaXNoIFNlYSwgbmVhciBDYW1wYmVsbCBSaXZlcidzIFdpbGxvdyBQb2ludCBuZWlnaGJvcmhvb2QuIFRoZSBsb3dlciByZWFjaCBvZiBTaW1tcyBDcmVlayAoXH4zIGttIG9mIGNoYW5uZWwsIGVhc3Qgb2YgRG9nd29vZCBTdHJlZXQpLCBpcyBjb250YWluZWQgd2l0aGluIGEgbmFycm93IHVyYmFuIGdyZWVuIHdheSB0aGF0IGlzIGJvcmRlcmVkIGJ5IHJlc2lkZW50aWFsIHByb3BlcnRpZXMuIEZyb20gRG9nd29vZCBTdHJlZXQgUm9hZCB0aGUgc3RyZWFtcyBydW5zIGZvciB+IDIga20gdG8gdGhlIElubGFuZCBIaWdod2F5IGFuZCBpcyBwcm90ZWN0ZWQgd2l0aGluIFtCZWF2ZXIgTG9kZ2UgTGFuZHNdKGh0dHBzOi8vY2FtcGJlbGxyaXZlci50cmF2ZWwvbmV3cy9mb3Jlc3RyeS1ndWlkZS10by1iZWF2ZXItbG9kZ2UtbGFuZHMvKSwgdXBzdHJlYW0gb2YgdGhlIElubGFuZCBIaWdod2F5LCBcPjEuNSBrbSBvZiB0cmlidXRhcnkgY2hhbm5lbCBpcyBsb2NhdGVkIHdpdGhpbiBwcml2YXRlIGZvcmVzdCBsYW5kcyBpbiB2YXJpb3VzIHN0YWdlcyBvZiByZWdlbmVyYXRpb24uDQoNCkNodW0sIENoaW5vb2ssIFBpbmsgYW5kIENvaG8gc2FsbW9uIGhhdmUgYWxsIGJlZW4gb2JzZXJ2ZWQgaW4gU2ltbXMgQ3JlZWssIGFzIHdlbGwgYXMgQ29hc3RhbCBDdXR0aHJvYXQgVHJvdXQgKENDVCksIFJhaW5ib3cgVHJvdXQgYW5kIHN0ZWVsaGVhZC4gTW9yZSByZWNlbnQgbW9uaXRvcmluZyAoaS5lLiwgdGhpcyBkYXRhc2V0KSwgc3VnZ2VzdCB0aGF0IENvaG8gU2FsbW9uIChDTykgYW5kIENDVCBhcmUgdGhlIHByaW1hcnkgc3BlY2llcyB3aXRoaW4gU2ltbXMgQ3JlZWssIGJvdGggb2Ygd2hpY2ggYXJlIHByZXNlbnQgd2l0aGluIHRoZSBzdHJlYW0geWVhciByb3VuZCAtIHRob3VnaCBhIHNtYWxsIG51bWJlciBvZiBqdXZlbmlsZSBDaGlub29rIFNhbG1vbiB3ZXJlIGlkZW50aWZpZWQgaW4gMjAyNC4NCg0KW0dyZWVud2F5cyBMYW5kIFRydXN0XShodHRwczovL3d3dy5ncmVlbndheXN0cnVzdC5jYS8pIGhhcyBzdXBwb3J0ZWQgU2ltbXMgQ3JlZWsgU3Rld2FyZHMgZm9yICsyMCB5ZWFycywgaW5jbHVkaW5nIG9wZXJhdGlvbiBvZiBhIGZpc2ggZmVuY2UgbmVhciB0aGUgbW91dGggb2YgdGhlIHN0cmVhbSBzaW5jZSAyMDA4LiBKdXZlbmlsZSBhbmQgYWR1bHQgZmlzaCBtb3ZpbmcgcGFzdCB0aGUgZmVuY2UgYXJlIHRhbGxpZWQgZWFjaCBzcHJpbmcgYW5kIGZhbGwsIHJlc3BlY3RpdmVseS4gVGhlIG9iamVjdGl2ZSBvZiB0aGlzIHByb2plY3QgaXMgdG8gZXhwbG9yZSB0aGUganV2ZW5pbGUgZmVuY2UgZGF0YXNldC4gQWxsIHdvcmsgaXMgYmVpbmcgZG9uZSBzdHJpY3RseSBmb3IgZnVuIGFuZCBvdXQgb2YgcGVyc29uYWwgY3VyaW9zaXR5LiBBbnkgZmVlZGJhY2ssIGlucHV0LCBvciBzdXBwb3J0IGlzIHdlbGNvbWUuIEFsc28sIEkgaGF2ZSBhIHNvZnQgc3BvdCBmb3IgQ0NULCBzbyBiZSB3YXJuZWQgdGhhdCBlZmZvcnQgYW5kIHJlc3VsdHMgd2lsbCBiZSBzbGlnaHRseSB0cm91dCBiaWFzZWQuIExldCdzIHRha2UgYSBsb29rIGF0IHdoYXQgaGFzIGJlZW4gY29tcGxldGVkIHRvIGRhdGUuIEl0J3MgYSB0cmVtZW5kb3VzIGFtb3VudCBvZiB3b3JrIGFuZCBhbGwgdm9sdW50ZWVycyBhbmQgc3VwcG9ydGVycyBzaG91bGQgYmUgY29tbWVuZGVkIQ0KDQoNCg0KYGBge3IgMS4gTG9hZCBhbmQgRm9ybWF0IERhdGEsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQojIyBDbGVhciB3b3Jrc3BhY2UgIyMNCiMgcm0obGlzdCA9IGxzKCkpICANCg0KIyAjIyBMb2FkIFByZXBwZWQgRGF0YQ0KIyBzb3VyY2UoIlNvdXJjZUZpbGVzLzAuIFJ1blNvdXJjZUZpbGVzLlIiKQ0KIyANCiAgc291cmNlKCJTb3VyY2VGaWxlcy8xLiBMb2FkIGFuZCBQcmVwIERhdGEuUiIpDQojIA0KIyAjIyBMb2FkIFRyYXAgRWZmb3J0IERhdGENCiBzb3VyY2UoIlNvdXJjZUZpbGVzLzIuIFRyYXBwaW5nIEVmZm9ydC5SIikNCg0KYGBgDQoNCmBgYHtyIGRvd25sb2FkIGRhdGF9DQpkYXRhX2FsbCAlPiUNCmRvd25sb2FkX3RoaXMoDQogICAgb3V0cHV0X25hbWUgPSAiUmF3IEZlbmNlIERhdGEiLA0KICAgIG91dHB1dF9leHRlbnNpb24gPSAiLmNzdiIsDQogICAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIEZlbmNlIERhdGEgKC5jc3YpIiwNCiAgICBidXR0b25fdHlwZSA9ICJkZWZhdWx0IiwNCiAgICBoYXNfaWNvbiA9IFRSVUUsDQogICAgaWNvbiA9ICJmYSBmYS1zYXZlIg0KICApDQoNCnNpbW1zX2VudiAlPiUNCmRvd25sb2FkX3RoaXMoDQogICAgb3V0cHV0X25hbWUgPSAiUmF3IEZlbmNlIERhdGEiLA0KICAgIG91dHB1dF9leHRlbnNpb24gPSAiLmNzdiIsDQogICAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIEVudmlyb21lbnRhbCBEYXRhICguY3N2KSIsDQogICAgYnV0dG9uX3R5cGUgPSAiZGVmYXVsdCIsDQogICAgaGFzX2ljb24gPSBUUlVFLA0KICAgIGljb24gPSAiZmEgZmEtc2F2ZSINCiAgKQ0KYGBgDQoNCg0KIyAyLiBGZW5jZSBPcGVyYXRpb24NCg0KIyMjIDIuMS4gTW9uaXRvcmluZyBFZmZvcnQgey50YWJzZXQgLnRhYnNldC1kcm9wZG93bn0NClRoZSBTaW1tcyBDcmVlayBmaXNoIGZlbmNlIGhhcyBvcGVyYXRlZCBhbm51YWxseSBzaW5jZSAyMDA4LCB3aXRoIHRoZSBleGNlcHRpb24gb2YgMjAyMCBhbmQgMjAyMSB3aGVuIG9wZXJhdGlvbnMgd2VyZSBwYXVzZWQgZHVlIHRvIHRoZSBDT1ZJRC0xOSBQYW5kZW1pYyBhbmQgaW4gdGhlIHNwcmluZyBvZiAyMDIzIHdoZW4gZmVkZXJhbCBlbXBsb3llZXMgd2VyZSBvbiBzdHJpa2UuDQoNClNwcmluZyBzdXJ2ZXlzIHRhcmdldCBvdXQgbWlncmF0aW5nIGp1dmVuaWxlIENvaG8gU2FsbW9uIGJ1dCBhbHNvIGNhcHR1cmUgYW4gaW1wcmVzc2l2ZSBudW1iZXIgb2YgQ0NUIGFuZCBoYXZlIGV2ZW4gY2FwdHVyZWQgc29tZSBDaGlub29rIFNhbG1vbi4gU3ByaW5nIGZlbmNlIG1vbml0b3JpbmcgaGFzIHN0YXJ0ZWQgYXMgZWFybHkgYXMgYHIgZm9ybWF0KG1pbih0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyJdKSwgIiVCICVkIilgLCBob3dldmVyLCBtb3N0IHN1cnZleXMgKDUwJSkgZG9uJ3Qgc3RhcnQgdW50aWwgYHIgZm9ybWF0KG1pbih0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID49IDAuNV0pLCAiJUIgJWQiKWAuIEluIGVhY2ggbW9uaXRvcmluZyB5ZWFyLCB0aGUgZmVuY2UgaGFzIG9wZXJhdGVkIGNvbnRpbnVvdXNseSAoZS5nLiwgc2FtcGxpbmcgb2NjdXJyZWQgYXQgbGVhc3QgZGFpbHkpIGZyb20gYHIgZm9ybWF0KG1pbih0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID09IDEuMF0pLCAiJUIgJWQiKWAgdG8gYHIgZm9ybWF0KG1heCh0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID09IDEuMF0pLCAiJUIgJWQiKWAuIFN1cnZleXMgaGF2ZSBjb250aW51ZWQgYXMgbGF0ZSBhcyBgciBmb3JtYXQobWF4KHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kPT0iU3ByaW5nIl0pLCAiJUIgJWQiKWAsIGJ1dCBtb3N0ICg1MCUpIGFyZSB0ZXJtaW5hdGVkIGJ5IGByIGZvcm1hdChtYXgodHJhcF9wbG90JGRhdGUuc3RkW3RyYXBfcGxvdCRQZXJpb2Q9PSJTcHJpbmciICYgdHJhcF9wbG90JHByb3Auc2FtcGxlZD09MC41XSksICIlQiAlZCIpYC4NCg0KRmFsbCBzdXJ2ZXlzIHRvIGNvdW50IHRoZSBudW1iZXIgcmV0dXJuaW5nIGFkdWx0IENvaG8sIENoaW5vb2ssIENodW0gYW5kIFBpbmsgU2FsbW9uIGFuZCBhbHNvIGludGVyY2VwdCBhIHNtYWxsIG51bWJlciBvZiBDQ1QuIEluIHRoZSBmYWxsLCBzdXJ2ZXlzIGhhdmUgc3RhcnRlZCBhcyBlYXJseSBhcyBgciBmb3JtYXQobWluKHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kPT0iRmFsbCJdKSwgIiVCICVkIilgLCBob3dldmVyLCBtb3N0IHN1cnZleXMgKDUwJSkgaGF2ZSBzdGFydGVkIG9uIGByIGZvcm1hdChtaW4odHJhcF9wbG90JGRhdGUuc3RkW3RyYXBfcGxvdCRQZXJpb2Q9PSJGYWxsIiAmIHRyYXBfcGxvdCRwcm9wLnNhbXBsZWQgPj0gMC41XSksICIlQiAlZCIpYC4gSW4gZWFjaCBtb25pdG9yaW5nIHllYXIsIHN1cnZleXMgaGF2ZSBvY2N1cnJlZCBjb250aW51b3VzbHkgKGUuZy4sIHNhbXBsaW5nIG9jY3VycmVkIGRhaWx5KSBmcm9tIGByIGZvcm1hdChtaW4odHJhcF9wbG90JGRhdGUuc3RkW3RyYXBfcGxvdCRQZXJpb2Q9PSJGYWxsIiAmIHRyYXBfcGxvdCRwcm9wLnNhbXBsZWQgPT0gMS4wXSksICIlQiAlZCIpYCB0byBgciBmb3JtYXQobWF4KHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kPT0iRmFsbCIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID09IDEuMF0pLCAiJUIgJWQiKWAuIFN1cnZleXMgaGF2ZSBjb250aW51ZWQgYXMgbGF0ZSBhcyBgciBmb3JtYXQobWF4KHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kID09IkZhbGwiXSksICIlQiAlZCIpYCBhbmQgbm8gc3VydmV5cyBoYXZlIG9jY3VycmVkIGxhdGVyIHRoYW4gYHIgZm9ybWF0KG1heCh0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IkZhbGwiICYgdHJhcF9wbG90JHByb3Auc2FtcGxlZCA+PSAwLjVdKSwgIiVCICVkIilgLg0KDQoNCiMjIyMgTW9uaXRvcmluZyBFZmZvcnQgVGFibGVzIGFuZCBGaWd1cmVzDQoNCiMjIyMgVGFibGUgMS4gU2FtcGxpbmcgU3VtbWFyeQ0KYGBge3IgMi4gVHJhcCBFZmZvcnQgU3VtbWFyeSBUYWJsZSAsIGZpZy5jYXAgPSAiVGFibGUgMS4gU3VtbWFyeSBvZiBzcHJpbmcgYW5kIGZhbGwgc2FtcGxpbmcgZWZmb3J0LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQprYWJsZSh0cmFwX2VmZm9ydF9zdW1tYXJ5X3RhYmxlLA0KICAgICAgImh0bWwiLA0KICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgDQogICAgICBhbGlnbiA9IGMoImMiKSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlBlcmlvZCIsIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiksDQogICAgICBjYXB0aW9uID0gIlRhYmxlIDEuIEFubnVhbCBzcHJpbmcgdHJhcCBvcGVyYXRpb24gcGVyaW9kcy4iLA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogICAgDQogICAgICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9ICBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUgPSAxMiwNCiAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFRSVUUpICU+JQ0KICAgICAgICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIiMgRGF5cyBTYW1wbGVkIiA9IDQsICJTdGFydCBEYXRlIiA9IDQsICJFbmQgRGF0ZSI9NCkpDQoNCmBgYA0KDQoNCiMjIyMgVGFibGUgMi4gQW5udWFsIFNwcmluZyBhbmQgRmFsbCBUcmFwIE9wZXJhdGlvbiBQZXJpb2RzDQpgYGB7ciAyLiBUcmFwIEVmZm9ydCBUYWJsZSB0cmFwIGVmZm9ydCB0YWJsZSwgZmlnLmNhcCA9ICJUYWJsZSAyLiBBbm51YWwgc3ByaW5nIGFuZCBmYWxsIHRyYXAgb3BlcmF0aW9uIHBlcmlvZHMuIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoNCg0KIyMgS2FibGUgLSBNYXN0ZXIgU3VtbWFyeSAtLS0tDQpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJy0nKQ0KICAgIA0KDQogICAga2FibGUodHJhcF9lZmZvcnRfdGFibGUsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgY29sLm5hbWVzID0gYygiWWVhciIsICIjIERheXMgU2FtcGxlZCIsICJTdGFydCIsICJFbmQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyBEYXlzIFNhbXBsZWQiLCAiU3RhcnQiLCAiRW5kIiksDQogICAgICBjYXB0aW9uID0gIlRhYmxlIDIuIEFubnVhbCBzcHJpbmcgYW5kIGZhbGwgdHJhcCBvcGVyYXRpb24gcGVyaW9kcy4iLA0KICAgICAgDQogICAgICBkaWdpdHMgPSAxKSAlPiUNCiAgY29sdW1uX3NwZWMoYygyLDUpLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSAgRkFMU0UsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgICAgZm9udF9zaXplID0gMTIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBUUlVFKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJTcHJpbmcgU2FtcGxpbmciID0gMywgIkZhbGwgU2FtcGxpbmciID0gMykpDQpgYGANCg0KDQo8IS0tICoqYHIgZmlnX251bXMoImZhbGwudHJhcC5wbG90IiwgIkZhbGwgdHJhcCBvcGVyYXRpb24gcGVyaW9kLCBwcmVzZW50ZWQgYXMgdGhlIHByb3BvcnRpb24gb2Ygc2FtcGxlIHllYXJzIGVhY2ggZGF0ZSBoYXMgYmVlbiB0cmFwcGVkIHNpbmNlIDIwMDggKGV4Y2x1ZGluZyB5ZWFycyB3aGVuIHRyYXBwaW5nIGRpZCBub3Qgb2NjdXIgZHVlIHRvIENPVklEIG9yIGdvdmVybm1lbnQgc3RyaWtlcykuIilgKiogLS0+DQoNCg0KDQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQojIyBMb2FkIFN0cmVhbSBDb25kaXRpb25zIERhdGEgDQogc291cmNlKCJTb3VyY2VGaWxlcy8zLiBTdHJlYW0gQ29uZGl0aW9ucy5SIikNCg0KYGBgDQoNCiMjIyAyLjIgU3RyZWFtIENvbmRpdGlvbnMgey50YWJzZXQgLnRhYnNldC1kcm9wZG93bn0NCg0KRHVyaW5nIGVhY2ggZGFpbHkgdHJhcCB2aXNpdCwgdm9sdW50ZWVycyByZWNvcmQgbWVhc3VyZXMgb2Ygd2F0ZXIgdGVtcGVyYXR1cmUsIHBILCBUb3RhbCBTdXNwZW5kZWQgU2VkaW1lbnQgKFRTUyksIGRpc3NvbHZlZCBveHlnZW4sIGFuZCB3YXRlciBsZXZlbCAoc3RhZ2UpLiBNZWFuIGFubnVhbCBtZWFzdXJlcyBvZiBlYWNoIHBhcmFtZXRlciBhcmUgcHJlc2VudGVkIGJlbG93IGZvciB0aGUgc3ByaW5nIGFuZCBmYWxsIG1vbml0b3JpbmcgcGVyaW9kcyAoVGFibGUgMyBhbmQgVGFibGUgNCwgRmlndXJlIDIpLiANCg0KIyMjIyBTdHJlYW0gQ29uZGl0aW9ucyBGaWd1cmVzIGFuZCBUYWJsZXMNCg0KIyMjIyBUYWJsZSAzLiBTcHJpbmcgQ29uZGl0aW9uIFRhYmxlDQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIFNwcmluZyBUYWJsZSwgZmlnLmNhcCA9ICJUYWJsZSAzLiBPdmVyYWxsIGFubnVhbCBzdHJlYW0gY29uZGl0aW9ucyBkdXJpbmcgc3ByaW5nIHRyYXAgbW9uaXRvcmluZyBmcm9tIDIwMDggdG8gMjAyNC4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQpjb25kX2RhdGFfd2lkZS5zcHJpbmcgPC0gY29uZF9kYXRhX3dpZGUgJT4lIHNlbGVjdCgxOjEzKQ0KDQojIyBLYWJsZSAtIFN0cmVhbSBDb25kaXRpb25zIC0tLS0NCm9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAnLScpDQogICAgDQoNCiAgICBrYWJsZShjb25kX2RhdGFfd2lkZS5zcHJpbmcsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgY29sLm5hbWVzID0gYygiICIsICJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiKSwNCiAgICAgIGNhcHRpb24gPSAiVGFibGUgMy4gU3RyZWFtIGNvbmRpdGlvbnMgZHVyaW5nIHNwcmluZyB0cmFwIG9wZXJhdGlvbi4iLA0KICAgICAgDQogICAgICBkaWdpdHMgPSAxKSAlPiUNCiAgY29sdW1uX3NwZWMoYygyLDUpLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSAgRkFMU0UsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgICAgZm9udF9zaXplID0gMTIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBUUlVFKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiQWlyIFRlbXAuIFxuKFx1MDBCMEMpIiA9IDIsICJXYXRlciBUZW1wLiBcbihcdTAwQjBDKSIgPSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwSCBcbi4gIiA9IDIsICJETyBcbihtZy9MKSIgPSAyLCAiVERTIFxuKHBwbSkiID0gMiwgIldhdGVyIExldmVsIFxuKG0pIiA9IDIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJZZWFyIj0gMSwgIlNwcmluZyBNb25pdG9yaW5nIiA9IDEyKSkgICAgDQoNCmBgYA0KDQojIyMjIFRhYmxlIDQuIEZhbGwgQ29uZGl0aW9uIFRhYmxlDQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIEZhbGwgVGFibGUsIGZpZy5jYXAgPSAiVGFibGUgNC4gT3ZlcmFsbCBhbm51YWwgc3RyZWFtIGNvbmRpdGlvbnMgZHVyaW5nIGZhbGwgdHJhcCBtb25pdG9yaW5nIGZyb20gMjAwOCB0byAyMDI0LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSxlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoNCmNvbmRfZGF0YV93aWRlLnNwcmluZyA8LSBjb25kX2RhdGFfd2lkZSAlPiUgc2VsZWN0KDEsIDE0OjI1KQ0KDQojIyBLYWJsZSAtIFN0cmVhbSBDb25kaXRpb25zIC0tLS0NCm9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAnLScpDQogICAgDQoNCiAgICBrYWJsZShjb25kX2RhdGFfd2lkZS5zcHJpbmcsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgY29sLm5hbWVzID0gYygiICIsICJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiKSwNCiAgICAgIGNhcHRpb24gPSAiVGFibGUgNC4gU3RyZWFtIGNvbmRpdGlvbnMgZHVyaW5nIGZhbGwgdHJhcCBvcGVyYXRpb24uIiwNCiAgICAgIA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogIGNvbHVtbl9zcGVjKGMoMiw1KSwgd2lkdGggPSAiMmNtIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gIEZBTFNFLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSA9IDEyLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVFJVRSkgJT4lIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIkFpciBUZW1wLiBcbihcdTAwQjBDKSIgPSAyLCAiV2F0ZXIgVGVtcC4gXG4oXHUwMEIwQykiID0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicEggXG4uICIgPSAyLCAiRE8gXG4obWcvTCkiID0gMiwgIlREUyBcbihwcG0pIiA9IDIsICJXYXRlciBMZXZlbCBcbihtKSIgPSAyKSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiWWVhciI9IDEsICJGYWxsIE1vbml0b3JpbmciID0gMTIpKSAgICANCmBgYA0KDQoNCg0KIyMjIyBGaWd1cmUgMi4gU3ByaW5nIGFuZCBGYWxsIENvbmRpdGlvbiBQbG90DQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIFBsb3QsIGZpZy5jYXAgPSAiRmlndXJlIDIuIEF2ZXJhZ2UgZGFpbHkgbWVhc3VyZXMgb2YgYWlyIGFuZCB3YXRlciB0ZW1wZXJhdHVyZSwgcEgsIGRpc3NvbHZlZCBveHlnZW4gKERPKSwgdG90YWwgZGlzc29sdmVkIHNvbGlkcyAoVERTKSBhbmQgd2F0ZXIgbGV2ZWwgKHN0YWdlKSBwZXIgbW9uaXRvcmluZyB5ZWFyIGluIHNwcmluZyBhbmQgZmFsbC4iLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy50b3BjYXB0aW9uID0gVFJVRX0NCg0KcHJpbnQoY29uZF9wbG90KQ0KYGBgDQoNCiMjIyAyLjMuIEFubnVhbCBDYXB0dXJlcyB7LnRhYnNldCAudGFic2V0LWRyb3Bkb3dufQ0KYGBge3IgNC4gRmlzaCBDYXB0dXJlcyAtIFN1bW1hcnkgVGFibGUgY2F0Y2hfZGF0LnByZXAsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQ0Kc291cmNlKCJTb3VyY2VGaWxlcy80LiBBbm51YWwgQ2FwdHVyZXMuUiIpDQpgYGANCg0KYGBge3IgNC4gRmlzaCBDYXB0dXJlcyAtIHZhbHVlcyBmb3IgdGV4dCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQphbm51YWwuY2F0Y2hlcyA8LSBjYXRjaF9wbG90LmRhdGEgJT4lIGdyb3VwX2J5KFBlcmlvZCwgU3BlY2llcykgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZShtZWFuID0gcm91bmQobWVhbihuKSwwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihuKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChuKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEICA9IHNkKG4pKQ0KYW5udWFsLmNhdGNoZXMuc3ByaW5nLkNUIDwtIGFubnVhbC5jYXRjaGVzICU+JSBmaWx0ZXIoUGVyaW9kID09ICJTcHJpbmciLCBTcGVjaWVzID09ICJDVCIpDQphbm51YWwuY2F0Y2hlcy5zcHJpbmcuQ08gPC0gYW5udWFsLmNhdGNoZXMgJT4lIGZpbHRlcihQZXJpb2QgPT0gIlNwcmluZyIsIFNwZWNpZXMgPT0gIkNPIikNCmFubnVhbC5jYXRjaGVzLmZhbGwuQ1QgPC0gYW5udWFsLmNhdGNoZXMgJT4lIGZpbHRlcihQZXJpb2QgPT0gIkZhbGwiLCBTcGVjaWVzID09ICJDVCIpDQphbm51YWwuY2F0Y2hlcy5mYWxsLkNPIDwtIGFubnVhbC5jYXRjaGVzICU+JSBmaWx0ZXIoUGVyaW9kID09ICJGYWxsIiwgU3BlY2llcyA9PSAiQ08iKQ0KYGBgDQoNCg0KDQpTaW5jZSAyMDA4LCBhIHRvdGFsIG9mIGByIGZvcm1hdChzdW0oY2F0Y2hfYW5udWFsLlRhYmxlLlNwcmluZyRuQ1QpLCBiaWcubWFyayA9IiwiKWAganV2ZW5pbGUgQ0NUIGFuZCBgciBmb3JtYXQoc3VtKGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNPKSwgYmlnLm1hcmsgPSIsIilgIGp1dmVuaWxlIENvaG8gU2FsbW9uIGhhdmUgYmVlbiBjYXB0dXJlZCBkdXJpbmcgc3ByaW5nIHRyYXBwaW5nLiBBbm51YWwgY2FwdHVyZXMgb2YgQ0NUIGhhdmUgcmFuZ2VkIGZyb20gYHIgZm9ybWF0KG1pbihjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nJG5DVCksIGJpZy5tYXJrID0iLCIpYCB0byBgciBmb3JtYXQobWF4KGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNUKSwgYmlnLm1hcmsgPSIsIilgIChtZWFuID0gYHIgZm9ybWF0KG1lYW4oY2F0Y2hfYW5udWFsLlRhYmxlLlNwcmluZyRuQ1QpLCBkaWdpdHMgPSAxKWApIHdoaWxlIENPIGNhcHR1cmVzIGhhdmUgdmFyaWVkIGZyb20gYHIgZm9ybWF0KG1pbihjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nJG5DTyksIGJpZy5tYXJrID0iLCIpYCB0byBgciBmb3JtYXQobWF4KGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNPKSwgYmlnLm1hcmsgPSIsIilgIHdpdGggYW4gb3ZlcmFsbCBtZWFuIG9mIGByIGZvcm1hdChtZWFuKGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNPKSwgZGlnaXRzID0gMSlgIGZpc2ggKEZpZ3VyZSAzIGFuZCBGaWd1cmUgNCwgVGFibGUgNSBhbmQgVGFibGUgNikuDQoNCkFzIGV4cGVjdGVkLCBtb3N0IGZpc2ggYXJlIGNhcHR1cmVkIGluIHRoZSBTcHJpbmcuIENhdGNoZXMgb2YgQ0NUIGhhdmUgcmFuZ2VkIGZyb20gYHIgYW5udWFsLmNhdGNoZXMuc3ByaW5nLkNUJG1pbmAgdG8gYHIgYW5udWFsLmNhdGNoZXMuc3ByaW5nLkNUJG1heGAgZHVyaW5nIHNwcmluZyAobWVhbiA9IGByIGFubnVhbC5jYXRjaGVzLnNwcmluZy5DVCRtZWFuYCAkXHBtJCBgciByb3VuZChhbm51YWwuY2F0Y2hlcy5zcHJpbmcuQ1QkU0QsMSlgKSBjb21wYXJlZCB0byBvbmx5IGByIGFubnVhbC5jYXRjaGVzLmZhbGwuQ1QkbWluYCB0byBgciBhbm51YWwuY2F0Y2hlcy5mYWxsLkNUJG1heGAgZmlzaCBkdXJpbmcgZmFsbCAobWVhbiA9IGByIGFubnVhbC5jYXRjaGVzLmZhbGwuQ1QkbWVhbmAgJFxwbSQgYHIgcm91bmQoYW5udWFsLmNhdGNoZXMuZmFsbC5DVCRTRCwxKWApLiANCg0KDQojIyMjIEFubnVhbCBDYXB0dXJlcyBGaWd1cmVzIGFuZCBUYWJsZXMNCg0KIyMjIyBGaWd1cmUgMy4gU3ByaW5nIC0gVG90YWwgYW5udWFsIGNhdGNoZXMNCmBgYHtyIDQuIEFubnVhbCBDYXB0dXJlcyAtIFNwcmluZyBTdW1tYXJ5IFBsb3QsIGZpZy5jYXAgPSAiRmlndXJlIDMuIFRvdGFsIGFubnVhbCBjYXRjaCBvZiBDQ1QgYW5kIENvaG8gU2FsbW9uIGR1cmluZyBTcHJpbmcgZmVuY2UgbW9uaXRvcmluZy4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0NCg0KcHJpbnQoY2F0Y2hfYW5udWFsX2JhclBsb3QuU3ByaW5nKQ0KYGBgDQojIyMjIFRhYmxlIDUuIFNwcmluZyAtIFRvdGFsIGFubnVhbCBjYXRjaGVzDQpgYGB7ciA0LiBBbm51YWwgQ2FwdHVyZXMgLSBTcHJpbmcgU3VtbWFyeSBUYWJsZSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyMgS2FibGUgLSBNYXN0ZXIgU3VtbWFyeSAtLS0tDQpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJy0nKQ0KDQpjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nICU+JSBncm91cF9ieShZZWFyKSAlPiUgbXV0YXRlKHRvdGFsLmNhdGNoID0gbkNUICsgbkNPKQ0KDQprYWJsZShjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nICAlPiUgZ3JvdXBfYnkoWWVhcikgJT4lIG11dGF0ZSh0b3RhbC5jYXRjaCA9IG5DVCArIG5DTyksDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgIyBjb2wubmFtZXMgPSBjKCJZZWFyIiwgIlBlcmlvZCIsICJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCANCiAgICAgIGNvbC5uYW1lcyA9IGMoIlllYXIiLCAiU3RhcnQiLCAiRW5kIiwgIiMgRGF5cyBTYW1wbGVkIiwgIA0KICAgICAgICAgICAgICAgICAgICAiTWVkLiIsIk1pbiIsIk1heCIsICJuIiwgIk1lYW4iLCAiU0QiICwiTWluIiwiTWF4IiwNCiAgICAgICAgICAgICAgICAgICAgIk1lZC4iLCJNaW4iLCJNYXgiLCAibiIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIsICJuIiksDQogICAgICBjYXB0aW9uID0gIioqVGFibGUgNS4gU3ByaW5nIGNhcHR1cmUgc3VtbWFyeSAtIGNhcHR1cmUgdGltaW5nLCB0b3RhbCBjYXB0dXJlcyBhbmQgbGVuZ3RoIG9mIENDVCBhbmQgQ29obyBTYWxtb24uKioiLA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogICNjb2x1bW5fc3BlYyhjKDEsIDMsMTAsMTcpLCBib2xkID0gVFJVRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gIEZBTFNFLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSA9IDEyLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVFJVRSkgJT4lDQogICMgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJTYW1wbGUgUGVyaW9kIiA9IDMsIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIlNhbXBsZSBQZXJpb2QiID0gMywgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSBUaW1pbmciID0gMywiRm9yayBMZW5ndGggKG1tKSIgPSA1LA0KICAgICAgICAgICAgICAgICAgICAgIkNhcHR1cmUgVGltaW5nIiA9IDMsIkZvcmsgTGVuZ3RoIChtbSkiID0gNSwiKENUK0NPKSI9MSkpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gNCwgIkNDVCIgPSA4LCAiQ29obyBTYWxtb24iID0gOCwiVG90YWwiPTEpKSANCmBgYA0KDQojIyMjIEZpZ3VyZSA0LiBGYWxsIC0gVG90YWwgYW5udWFsIGNhdGNoZXMNCmBgYHtyIDQuIEFubnVhbCBDYXB0dXJlcyAtIEZhbGwgU3VtbWFyeSBQbG90LCBmaWcuY2FwID0gIkZpZ3VyZSA0LiBUb3RhbCBhbm51YWwgY2F0Y2ggb2YgQ0NUIGFuZCBDb2hvIFNhbG1vbiBkdXJpbmcgZmFsbCBmZW5jZSBtb25pdG9yaW5nLiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEyfQ0KDQpwcmludChjYXRjaF9hbm51YWxfYmFyUGxvdC5GYWxsKQ0KYGBgDQoNCiMjIyMgVGFibGUgNi4gRmFsbCAtIFRvdGFsIGFubnVhbCBjYXRjaGVzDQpgYGB7ciBBbm51YWwgQ2FwdHVyZXMgLSBGYWxsIFN1bW1hcnkgVGFibGUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMjIEthYmxlIC0gTWFzdGVyIFN1bW1hcnkgLS0tLQ0Kb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICctJykNCg0Ka2FibGUoY2F0Y2hfYW5udWFsLlRhYmxlLkZhbGwsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgIyBjb2wubmFtZXMgPSBjKCJZZWFyIiwgIlBlcmlvZCIsICJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCANCiAgICAgIGNvbC5uYW1lcyA9IGMoIlllYXIiLCAiU3RhcnQiLCAiRW5kIiwgIiMgRGF5cyBTYW1wbGVkIiwgIA0KICAgICAgICAgICAgICAgICAgICAiTWVkLiIsIk1pbiIsIk1heCIsICJuIiwgIk1lYW4iLCAiU0QiICwiTWluIiwiTWF4IiwNCiAgICAgICAgICAgICAgICAgICAgIk1lZC4iLCJNaW4iLCJNYXgiLCAibiIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIpLA0KICAgICAgY2FwdGlvbiA9ICIqKlRhYmxlIDYuIEZhbGwgY2FwdHVyZSBzdW1tYXJ5IC0gY2FwdHVyZSB0aW1pbmcsIHRvdGFsIGNhcHR1cmVzIGFuZCBsZW5ndGggb2YgQ0NUIGFuZCBDb2hvIFNhbG1vbi4qKiIsDQogICAgICBkaWdpdHMgPSAxKSAlPiUNCiAgI2NvbHVtbl9zcGVjKGMoMSwgMywxMCwxNyksIGJvbGQgPSBUUlVFKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSAgRkFMU0UsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgICAgZm9udF9zaXplID0gMTIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBUUlVFKSAlPiUNCiAgIyBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIlNhbXBsZSBQZXJpb2QiID0gMywgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiU2FtcGxlIFBlcmlvZCIgPSAzLCAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICJDYXB0dXJlIFRpbWluZyIgPSAzLCJGb3JrIExlbmd0aCAobW0pIiA9IDUsDQogICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSBUaW1pbmciID0gMywiRm9yayBMZW5ndGggKG1tKSIgPSA1KSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSA0LCAiQ0NUIiA9IDgsICJDb2hvIFNhbG1vbiIgPSA4KSkgDQpgYGANCiMjIyAyLjQgTGVuZ3RoIEZyZXF1ZW5jeSB7LnRhYnNldCAudGFic2V0LWRyb3Bkb3dufQ0KYGBge3IgNi4gTGVuZ3RoIEZyZXF1ZW5jeSAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQogc291cmNlKCJTb3VyY2VGaWxlcy82LiBMZW5ndGggRnJlcXVlbmN5LlIiKQ0KYGBgDQoNCmBgYHtyIDYuIGxlbmd0aCB2YWx1ZXMsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCnNwcmluZy5kYXQgPC0gZGF0YV9hbGwgJT4lIGZpbHRlcihQZXJpb2QgPT0gIlNwcmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoPjIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgJWluJSBjKCJDTyIsIkNUIikpDQpDT19taW4gPC0gbWluKHNwcmluZy5kYXQkTGVuZ3RoW3NwcmluZy5kYXQkU3BlY2llcz09IkNPIl0sIG5hLnJtID0gVFJVRSkNCkNPX21heCA8LSBtYXgoc3ByaW5nLmRhdCRMZW5ndGhbc3ByaW5nLmRhdCRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKQ0KDQoNCkNUX21pbiA8LSBtaW4oc3ByaW5nLmRhdCRMZW5ndGhbc3ByaW5nLmRhdCRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKQ0KQ1RfbWF4IDwtIG1heChzcHJpbmcuZGF0JExlbmd0aFtzcHJpbmcuZGF0JFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpDQoNCkFnZWQgPC0gc3ByaW5nLmRhdCAlPiUgbXV0YXRlKEFnZSA9aWZlbHNlKFNwZWNpZXMgPT0gIkNPIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShMZW5ndGggPDExMCwgMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoU3BlY2llcyA9PSAiQ1QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKExlbmd0aCA8ODAsIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShMZW5ndGggPDE1MCwgMSwgMikpLE5BKSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KFBlcmlvZCwgU3BlY2llcywgTGVuZ3RoLCBBZ2UpDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgYWdlLnRhYmxlIDwtIEFnZWQgJT4lIG11dGF0ZShBZ2UgPSBhcy5mYWN0b3IoQWdlKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFNwZWNpZXMsIEFnZSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gbWluKExlbmd0aCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgoTGVuZ3RoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZyA9IG1lYW4oTGVuZ3RoKSkNCiAgICANCkNPLkFnZTAucGVyYyA8LSBhZ2UudGFibGUkblthZ2UudGFibGUkU3BlY2llcyA9PSJDTyIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2UudGFibGUkQWdlID09MF0vKGFnZS50YWJsZSRuW2FnZS50YWJsZSRTcGVjaWVzID09IkNPIiAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2UudGFibGUkQWdlID09MF0rIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2UudGFibGUkblthZ2UudGFibGUkU3BlY2llcyA9PSJDTyIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZS50YWJsZSRBZ2UgPT0xXSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQpUaGUgbGVuZ3RoIGZyZXF1ZW5jeSBmaWd1cmVzIHNob3duIGJlbG93IHNoZWQgbGlnaHQgb24gdGhlIHBvcHVsYXRpb24gc3RydWN0dXJlIGFuZCBiZWhhdmlvdXJzIG9mIENvaG8gU2FsbW9uIGFuZCBDQ1QgaW4gU2ltbXMgQ3JlZWsuIFRoZSBsZW5ndGhzIG9mIENDVCAoYHIgQ1RfbWluYCBtbSB0byBgciBDT19tYXhgIG1tKSBhbmQgQ29obyBTYWxtb24gKGByIENPX21pbmAgbW0gdG8gYHIgQ09fbWF4YCBtbSkgbWVhc3VyZWQgYXQgdGhlIGZlbmNlIHN1Z2dlc3QgbXVsdGlwbGUgYWdlIGNsYXNzZXMgb2YganV2ZW5pbGVzIGFyZSBtb3Zpbmcgb3V0IG9mIHRoZSBzeXN0ZW0gZWFjaCBzcHJpbmcuIEFzc3VtaW5nIHRoYXQgQ08gPDEwMCBtbSBhcmUgQWdlIDAgYW5kIENPID4xMDAgbW0gYXJlIEFnZSAxIHdvdWxkIHN1Z2dlc3QgdGhhdCBgciBwZXJjZW50KHJvdW5kKENPLkFnZTAucGVyYyxkaWdpdHMgPSAzKSlgIG9mIGFsbCBvdmVyYWxsIG1pZ3JhbnRzIGFyZSBBZ2UgMCBhbmQgdGhlIHJlbWFpbmRlciBhcmUgQWdlIDEuIEEgd2lkZXIgcmFuZ2Ugb2YgYWdlIGNsYXNzZXMgaXMgbGlrZWx5IHByZXNlbnQgYW1vbmcgQ0NULCBpbmNsdWRpbmcgQWdlIDAgZmlzaCAofjw4MCBtbSkgdXAgdG8gbWF0dXJlIGZpc2ggPiAyMzAgbW0gYW5kIHVwd2FyZHMgb2YgMysgeWVhcnMuIA0KDQpNYXR1cmUgQ0NUID4yMzAgbW0gcmVwcmVzZW50IDxgciBwZXJjZW50KHJvdW5kKENULkFnZUNsYXNzLlByb3AkQWR1bHQsIGRpZ2l0cyA9MykpYCBvZiB0aGUgdG90YWwgY2F0Y2ggb2YgQ0NULiBIb3dldmVyLCBhbGwgbWF0dXJlIENDVCA+MjMwIG1tIHdlcmUgbW92aW5nIGRvd25zdHJlYW0sIHN1Z2dlc3RpbmcgdGhhdCB0aGV5IGVpdGhlciAxKSBtb3ZlZCB1cHN0cmVhbSBhbmQgc3Bhd25lZCBwcmlvciB0byB0aGUgc3RhcnQgb2YgZmVuY2Ugb3BlcmF0aW9uIG9yIDIpIGhhZCBvdmVyd2ludGVyZWQgaW4gU2ltbXMgQ3JlZWsgYW5kIHdlcmUgZm9sbG93IGZyeSBvdXQgaW4gdGhlIHNwcmluZyAtIHdoZXRoZXIgdGhpcyB3YXMgdGhlaXIgZmlyc3QgbW92ZW1lbnQgdG8gdGhlIG9jZWFuIGlzIHVua25vd24uIA0KDQojIyMjIExlbmd0aCBGcmVxdWVuY3kgVGFibGUgYW5kIEZpZ3VyZXMNCg0KIyMjIyBGaWd1cmUgNS4gTGVuZ3RoIEZyZXF1ZW5jeSBvZiBhbGwgQ0NUDQpgYGB7ciA2LiBMZW5ndGggRnJlcXVlbmN5IC0gQ1QgTGVuZ3RoIEZyZXF1ZW5jeSBBbGwgWWVhcnMgQ29tYmluZWQsIGZpZy5jYXAgPSAiRmlndXJlIDUuIExlbmd0aCBGcmVxdWVuY3kgb2YgYWxsIENDVC4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDZ9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLmFsbC5DVCkNCmBgYA0KDQoNCiMjIyMgRmlndXJlIDYuIExlbmd0aCBmcmVxdWVuY3kgb2YgQ29hc3RhbCBDQ1QgYWNyb3NzIHllYXJzLg0KYGBge3IgNi4gTGVuZ3RoIEZyZXF1ZW5jeSAtIENUIExlbmd0aCBGcmVxdWVuY3kgQWNyb3NzIFllYXJzLCBmaWcuY2FwID0gIkZpZ3VyZSA2LiBMZW5ndGggRnJlcXVlbmN5IG9mIENDVCBhY3Jvc3MgeWVhcnMuIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMjB9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLkNUKQ0KYGBgDQoNCiMjIyMgRmlndXJlIDcuIExlbmd0aCBmcmVxdWVuY3kgb2YgYWxsIENvaG8gU2FsbW9uLg0KYGBge3IgNi4gTGVuZ3RoIEZyZXF1ZW5jeSAtIENPIExlbmd0aCBGcmVxdWVuY3kgQWxsIFllYXJzIENvbWJpbmVkLCBmaWcuY2FwID0gIkZpZ3VyZSA3LiBMZW5ndGggRnJlcXVlbmN5IG9mIEFsbCBDb2hvIFNhbG1vbi4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDZ9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLmFsbC5DTykNCmBgYA0KDQojIyMjIEZpZ3VyZSA4LiBMZW5ndGggZnJlcXVlbmN5IG9mIENvaG8gU2FsbW9uIGFjcm9zcyB5ZWFycy4NCmBgYHtyIDYuIExlbmd0aCBGcmVxdWVuY3kgLSBDTyBMZW5ndGggRnJlcXVlbmN5IEFjcm9zcyBZZWFycywgZmlnLmNhcCA9ICJGaWd1cmUgOC4gTGVuZ3RoIEZyZXF1ZW5jeSBvZiBDb2hvIFNhbG1vbiBhY3Jvc3MgeWVhcnMuIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMjB9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLkNPKQ0KYGBgDQoNCiMjIyAyLjUgQWdlIENvbXBvc2l0aW9uDQpgYGB7ciAxMC4gQWdlQ2xhc3NlcyAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQpzb3VyY2UoIlNvdXJjZUZpbGVzLzEwLiBBZ2VDbGFzc2VzLlIiKQ0KYGBgDQoNCk5vIHNjYWxlIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkIGR1cmluZyBqdXZlbmlsZSBlbnVtZXJhdGlvbiB3b3JrIG9uIFNpbW1zIENyZWVrLiBIb3dldmVyLCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb24gc3lzdGVtcyB3aXRoaW4gdGhlIHJlZ2lvbiBzdWdnZXN0cyB3ZSBjYW4gbG9vc2VseSBhcHBseSB0aGUgZm9sbG93aW5nIGFnZSBjbGFzc2VzIHRvIGp1dmVuaWxlIENUIGFuZCBDTzoNCg0KICAtICBDVCA8IDgwICB+IEFnZS0wIA0KICAtICBDVCA8IDEyMCB+IEFnZS0xDQogIC0gIENUIDwgMjAwIH4gQWdlLTINCiAgLSAgQ1QgPiAyMDAgfiBBZ2UtMisNCiAgLSAgQ08gPCA4MCAgfiBBZ2UtMA0KICAtICBDTyA8IDEyMCB+IEFnZS0xDQogIC0gIENPID4gMTIwIH4gQWdlLTErIA0KDQpBcHBseWluZyB0aGVzZSBhZ2UgYmlucyB0byB0aGUgbGVuZ3RoIGZyZXF1ZW5jeSBkYXRhIHN1Z2dlc3RzIHRoYXQgQ0NUIGFyZSByYW5nZSBpbiBhZ2UgZnJvbSBBZ2UtMSB0byBBZ2UgMyssIGJ1dCBhcmUgcHJpbWFyaWx5IEFnZS0yIChGaWd1cmUgOSksIHdoaWxlIENPIGFyZSBhbG1vc3QgZXhjbHVzaXZlbHkgQWdlLTEgKEZpZ3VyZSAxMCkuIEludGVyZXN0aW5nbHksIEFnZS0wIENPIHdlcmUgcHJlc2VudCBpbiAyMDA5IGFuZCAyMDI0LCBidXQgbm90IG90aGVyIHllYXJzLiBXaGlsZSB0aGlzIG1heSBiZSBjb2luY2lkZW50YWwsIGl0J3Mgd29ydGggbm90aW5nIHRoYXQgdGhlIHBlYWsganV2ZW5pbGUgQ0NUIGNvdW50cyB3ZXJlIHJlY29yZGVkIGluIDIwMDggYW5kIDIwMjQuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBtZWNoYW5pc21zIHRoYXQgbWF5IGV4cGxhaW4gd2h5IEFnZS0wIENPIHdlcmUgZmlyc3Qgb2JzZXJ2ZWQgaW4gMjAyNDogMSkgdGhleSB3ZXJlbid0IHJlY29yZGVkIGluIHBhc3QgeWVhcnMsIENPIGVtaWdyYXRlZCBvdXQgb2YgU2ltbXMgQ3JlZWsgZWFybGllciB0aGFuIG5vcm1hbCBkdWUgdG8gaGlnaCBDVCBhYnVuZGFuY2UuDQoNCiMjIyMgRmlndXJlIDkuIEFnZSBjb21wb3NpdGlvbiBhY3Jvc3MgeWVhcnMuDQpgYGB7ciAxMC4gQWdlIENsYXNzIC0gQ1QgQWdlIENsYXNzIENvbXBvc2l0aW9uIGFjcm9zcyB5ZWFycywgZmlnLmNhcCA9ICJGaWd1cmUgOS4gQXNzdW1lZCBhZ2UgY2xhc3MgY29tcG9zaXRpb24gb2YganV2ZW5pbGUgQ0NUIGFuZCBDb2hvIFNhbG1vbiBvdXQgbWlncmF0aW5nIGZyb20gU2ltbXMgQ3JlZWsgc2luY2UgMjAwOC4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAyMH0NCg0KanV2LkFnZUNsYXNzLnBsb3QNCg0KYGBgDQoNCg0KIyMjIyBGaWd1cmUgMTAuIFNpemUgYnkgYWdlIGNsYXNzIGFjcm9zcyB5ZWFycy4NCmBgYHtyIDEwLiBBZ2UgQ2xhc3MgLSBBZ2UgQ2xhc3MgU2l6ZSBhY3Jvc3MgeWVhcnMsIGZpZy5jYXAgPSAiRmlndXJlIDEwLiBNZWRpYW4gc2l6ZSBieSBhZ2UgY2xhc3Mgb2YgZmlzaCBvdXRtaWdyYXRpbmcgZnJvbSBTaW1tcyBDcmVlayBzaW5jZSAyMDA4LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDIwfQ0KDQphZ2UuY2xhc3Muc2l6ZQ0KDQpgYGANCg0KIyMjIDIuNi4gTWlncmF0aW9uIFRpbWluZyB7LnRhYnNldCAudGFic2V0LWRyb3Bkb3dufQ0KYGBge3IgNS4gQ2FwdHVyZSBUaW1pbmcgLSBMb2FkIERhdGEsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQ0KIHNvdXJjZSgiU291cmNlRmlsZXMvNS4gQ2FwdHVyZSBUaW1pbmcuUiIpDQpgYGANCg0KYGBge3IgNS4gQ2FwdHVyZSBUaW1pbmcgLSBQcmVwYXJlIHNwcmluZyB0ZXh0IHZhbHVlcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0UgfQ0KDQojIyBTcHJpbmcgZGF0YSBmb3IgdGV4dA0KQ1QuZmlyc3QuZGV0ZWN0aW9uLmVhcmxpZXN0IDwtIGZvcm1hdChtaW4ocGFzcy5wZXJpb2Quc3ByaW5nJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLnNwcmluZyRTcGVjaWVzPT0iQ1QiXSksICIlQiAlZCIpDQpDVC5maXJzdC5kZXRlY3Rpb24ubGF0ZXN0ICAgPC0gZm9ybWF0KG1heChwYXNzLnBlcmlvZC5zcHJpbmckbWluUGFzcy5taW5bcGFzcy5wZXJpb2Quc3ByaW5nJFNwZWNpZXM9PSJDVCJdKSwgIiVCICVkIikNCkNULmZpcnN0LmRldGVjdGlvbi5tZWFuICAgICA8LSBmb3JtYXQobWVhbihwYXNzLnBlcmlvZC5zcHJpbmckbWluUGFzcy5taW5bcGFzcy5wZXJpb2Quc3ByaW5nJFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ1QuZmlyc3QuZGV0ZWN0aW9uLlNEICAgICAgIDwtIHJvdW5kKHNkKHBhc3MucGVyaW9kLnNwcmluZyRtaW5NZWFuRGlmZltwYXNzLnBlcmlvZC5zcHJpbmckU3BlY2llcz09IkNUIl0sIG5hLnJtID0gVFJVRSksIDEpDQpDVC41MHAubWVhbiAgICAgICAgICAgICAgICAgPC0gZm9ybWF0KG1lYW4oY2F0Y2g1MHByb3Auc3ByaW5nJG1lYW5EYXRlNTBwW2NhdGNoNTBwcm9wLnNwcmluZyRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNULjUwcC5TRCAgICAgICAgICAgICAgICAgICA8LSByb3VuZChzZChjYXRjaDUwcHJvcC5zcHJpbmckRGF0ZTUwcERpZmZbY2F0Y2g1MHByb3Auc3ByaW5nJFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpLCAxKQ0KQ1QucGVhay5tZWFuICAgICAgICAgICAgICAgIDwtIGZvcm1hdChtZWFuKGNhdGNoX3BlYWsuc3ByaW5nJGRhdGUuc3RkX0NULG5hLnJtID0gVFJVRSksICIlQiAlZCIpDQpDVC5wZWFrLlNEICAgICAgICAgICAgICAgICAgPC0gcm91bmQoc2QoY2F0Y2hfcGVhay5zcHJpbmckTWVhbkRpZmZfQ1QsbmEucm0gPSBUUlVFKSwxKQ0KDQoNCkNPLmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdCA8LSBmb3JtYXQobWluKHBhc3MucGVyaW9kLnNwcmluZyRtaW5QYXNzLm1pbltwYXNzLnBlcmlvZC5zcHJpbmckU3BlY2llcz09IkNPIl0pLCAiJUIgJWQiKQ0KQ08uZmlyc3QuZGV0ZWN0aW9uLmxhdGVzdCAgIDwtIGZvcm1hdChtYXgocGFzcy5wZXJpb2Quc3ByaW5nJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLnNwcmluZyRTcGVjaWVzPT0iQ08iXSksICIlQiAlZCIpDQpDTy5maXJzdC5kZXRlY3Rpb24ubWVhbiAgICAgPC0gZm9ybWF0KG1lYW4ocGFzcy5wZXJpb2Quc3ByaW5nJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLnNwcmluZyRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNPLmZpcnN0LmRldGVjdGlvbi5TRCAgICAgICA8LSByb3VuZChzZChwYXNzLnBlcmlvZC5zcHJpbmckbWluTWVhbkRpZmZbcGFzcy5wZXJpb2Quc3ByaW5nJFNwZWNpZXM9PSJDTyJdLCBuYS5ybSA9IFRSVUUpLCAxKQ0KQ08uNTBwLm1lYW4gICAgICAgICAgICAgICAgIDwtIGZvcm1hdChtZWFuKGNhdGNoNTBwcm9wLnNwcmluZyRtZWFuRGF0ZTUwcFtjYXRjaDUwcHJvcC5zcHJpbmckU3BlY2llcz09IkNPIl0sIG5hLnJtID0gVFJVRSksICIlQiAlZCIpDQpDTy41MHAuU0QgICAgICAgICAgICAgICAgICAgPC0gcm91bmQoc2QoY2F0Y2g1MHByb3Auc3ByaW5nJERhdGU1MHBEaWZmW2NhdGNoNTBwcm9wLnNwcmluZyRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgMSkNCkNPLnBlYWsubWVhbiAgICAgICAgICAgICAgICA8LSBmb3JtYXQobWVhbihjYXRjaF9wZWFrLnNwcmluZyRkYXRlLnN0ZF9DTyxuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ08ucGVhay5TRCAgICAgICAgICAgICAgICAgIDwtIHJvdW5kKHNkKGNhdGNoX3BlYWsuc3ByaW5nJE1lYW5EaWZmX0NPLG5hLnJtID0gVFJVRSksMSkNCg0KYGBgDQoNCioqMi40LjEgU3ByaW5nIE91dG1pZ3JhdGlvbioqDQoNCk91dG1pZ3JhdGluZyBqdXZlbmlsZSBDQ1QgYW5kIENvaG8gU2FsbW9uIHdlcmUgZmlyc3QgZW5jb3VudGVyZWQgYXQgdGhlIHRyYXAgb3ZlciBhIHNpbWlsYXIgcGVyaW9kLCBmcm9tIGByIENULmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdGAgdG8gYHIgQ1QuZmlyc3QuZGV0ZWN0aW9uLmxhdGVzdGAgKG1lYW4gJFxwbSQgU0QgPSBgciBDVC5maXJzdC5kZXRlY3Rpb24ubWVhbmAgJFxwbSQgYHIgQ1QuZmlyc3QuZGV0ZWN0aW9uLlNEYCBkYXlzKSBmb3IgQ0NUIGFuZCBgciBDTy5maXJzdC5kZXRlY3Rpb24uZWFybGllc3RgIHRvIGByIENPLmZpcnN0LmRldGVjdGlvbi5sYXRlc3RgIGZvciBDb2hvIChtZWFuICRccG0kIFNEID0gYHIgQ08uZmlyc3QuZGV0ZWN0aW9uLm1lYW5gICRccG0kIGByIENPLmZpcnN0LmRldGVjdGlvbi5TRGAgZGF5cykuIE9uIGF2ZXJhZ2UgNTAlIG9mIGFsbCBDQ1QgaGFkIHBhc3NlZCB0aGUgZmVuY2UgYnkgYHIgQ1QuNTBwLm1lYW5gJFxwbSQgYHIgQ1QuNTBwLlNEYCBkYXlzIHdoaWxlIGhhbGYgb2YgQ29obyBTYWxtb24gbWlncmFudHMgaGFkIHBhc3NlZCB0aGUgZmVuY2UgYnkgYHIgQ08uNTBwLm1lYW5gJFxwbSQgYHIgQ08uNTBwLlNEYCBkYXlzLiBEZXNwaXRlIHNpbWlsYXJpdGllcyBpbiB3aGVuIG1pZ3JhdGlvbnMgc3RhcnRlZCBhbmQgdGhlIHRpbWluZyB0aGF0IG1vc3QgbWlncmFudHMgaGFkIHBhc3QgdGhlIGZlbmNlLCB0aGVyZSB3YXMgYSBub3RpY2VhYmxlIGRpZmZlcmVuY2UgaW4gdGhlIHRpbWluZyBvZiBwZWFrIG1pZ3JhdGlvbnMgKHRoZSBkYXRlIHdoZW4gdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBmaXNoIHBhc3NlZCB0aGUgZmVuY2UpLiBGb3IgQ29hc3RhbCBDQ1QsIHRoZSBvdmVyYWxsIG1lYW4gJFxwbSQgU0QgcGVhayBtaWdyYXRpb24gb2NjdXJyZWQgb24gYHIgQ1QucGVhay5tZWFuYCgkXHBtJCBgciBDVC5wZWFrLlNEYCBkYXlzKSAoRmlndXJlIDUpIHdoZXJlYXMgb3ZlcmFsbCBtZWFuIHBlYWsgQ29obyBTYWxtb24gbWlncmF0aW9uIG9jY3VycmVkIG1vcmUgdGhhbiBhIHdlZWsgbGF0ZXIgb24gYHIgQ08ucGVhay5tZWFuYCAoJFxwbSQgYHIgQ08ucGVhay5TRGAgZGF5cykgKEZpZ3VyZSA2KS4gVG90YWwgbnVtYmVyIG9mIGRhaWx5IGNhcHR1cmVzIG9mIENDVCBhbmQgQ29obyBTYWxtb24gcGVyIHllYXIgYXJlIHByZXNlbnRlZCBpbiBGaWd1cmUgNiBhbmQgRmlndXJlIDcsIHJlc3BlY3RpdmVseS4gDQoNCmBgYHtyIDUuIENhcHR1cmUgVGltaW5nIC0gUHJlcGFyZSBmYWxsIHRleHQgdmFsdWVzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRSB9DQojIyBGYWxsIGRhdGEgZm9yIHRleHQNCkNULmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdCA8LSBmb3JtYXQobWluKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ1QiXSksICIlQiAlZCIpDQpDVC5maXJzdC5kZXRlY3Rpb24ubGF0ZXN0ICAgPC0gZm9ybWF0KG1heChwYXNzLnBlcmlvZC5mYWxsJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNUIl0pLCAiJUIgJWQiKQ0KQ1QuZmlyc3QuZGV0ZWN0aW9uLm1lYW4gICAgIDwtIGZvcm1hdChtZWFuKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNULmZpcnN0LmRldGVjdGlvbi5TRCAgICAgICA8LSByb3VuZChzZChwYXNzLnBlcmlvZC5mYWxsJG1pbk1lYW5EaWZmW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNUIl0sIG5hLnJtID0gVFJVRSksIDEpDQpDVC41MHAubWVhbiAgICAgICAgICAgICAgICAgPC0gZm9ybWF0KG1lYW4oY2F0Y2g1MHByb3AuZmFsbCRtZWFuRGF0ZTUwcFtjYXRjaDUwcHJvcC5mYWxsJFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ1QuNTBwLlNEICAgICAgICAgICAgICAgICAgIDwtIHJvdW5kKHNkKGNhdGNoNTBwcm9wLmZhbGwkRGF0ZTUwcERpZmZbY2F0Y2g1MHByb3AuZmFsbCRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKSwgMSkNCkNULnBlYWsubWVhbiAgICAgICAgICAgICAgICA8LSBmb3JtYXQobWVhbihjYXRjaF9wZWFrLmZhbGwkZGF0ZS5zdGRfQ1QsbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNULnBlYWsuU0QgICAgICAgICAgICAgICAgICA8LSByb3VuZChzZChjYXRjaF9wZWFrLmZhbGwkTWVhbkRpZmZfQ1QsbmEucm0gPSBUUlVFKSwxKQ0KDQoNCkNPLmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdCA8LSBmb3JtYXQobWluKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ08iXSksICIlQiAlZCIpDQpDTy5maXJzdC5kZXRlY3Rpb24ubGF0ZXN0ICAgPC0gZm9ybWF0KG1heChwYXNzLnBlcmlvZC5mYWxsJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNPIl0pLCAiJUIgJWQiKQ0KQ08uZmlyc3QuZGV0ZWN0aW9uLm1lYW4gICAgIDwtIGZvcm1hdChtZWFuKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNPLmZpcnN0LmRldGVjdGlvbi5TRCAgICAgICA8LSByb3VuZChzZChwYXNzLnBlcmlvZC5mYWxsJG1pbk1lYW5EaWZmW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNPIl0sIG5hLnJtID0gVFJVRSksIDEpDQpDTy41MHAubWVhbiAgICAgICAgICAgICAgICAgPC0gZm9ybWF0KG1lYW4oY2F0Y2g1MHByb3AuZmFsbCRtZWFuRGF0ZTUwcFtjYXRjaDUwcHJvcC5mYWxsJFNwZWNpZXM9PSJDTyJdLCBuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ08uNTBwLlNEICAgICAgICAgICAgICAgICAgIDwtIHJvdW5kKHNkKGNhdGNoNTBwcm9wLmZhbGwkRGF0ZTUwcERpZmZbY2F0Y2g1MHByb3AuZmFsbCRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgMSkNCkNPLnBlYWsubWVhbiAgICAgICAgICAgICAgICA8LSBmb3JtYXQobWVhbihjYXRjaF9wZWFrLmZhbGwkZGF0ZS5zdGRfQ08sbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNPLnBlYWsuU0QgICAgICAgICAgICAgICAgICA8LSByb3VuZChzZChjYXRjaF9wZWFrLmZhbGwkTWVhbkRpZmZfQ08sbmEucm0gPSBUUlVFKSwxKQ0KDQpgYGANCg0KKioyLjQuMiBGYWxsIFJldHVybiBUaW1pbmcqKg0KDQpBZHVsdCBDb2hvIFNhbG1vbiBoYXZlIGJlZW4gZGV0ZWN0ZWQgYXQgdGhlIGZlbmNlIGFzIGVhcmx5IGFzIGByIENPLmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdGAgYW5kIGFzIGxhdGUgYXMgYHIgQ08uZmlyc3QuZGV0ZWN0aW9uLmxhdGVzdGAsIHRob3VnaCBtb3N0IG9mIHRoZSBydW4gKDUwJSkgYXJyaXZlIHdpdGhpbiBhIHdlZWsgb2YgYHIgQ08uNTBwLm1lYW5gIChGaWd1cmUgMTQgdG8gMTkpLiBSZWxhdGl2ZSB0byBzcHJpbmcgc2FtcGxpbmcsIENDVCBhcmUgZW5jb3VudGVyZWQgbGVzcyBmcmVxdWVudGx5IGluIHRoZSBmYWxsIGFuZCAgYXJyaXZhbCB0aW1pbmcgYXBwZWFycyB0byBiZSBjb25zaWRlcmFibHkgbW9yZSB2YXJpYWJsZSAoRmlndXJlIDIwIHRvIDIyKS4gICAgIA0KDQoNCiMjIyMgU3ByaW5nIGFuZCBGYWxsIE1pZ3JhdGlvbiBUaW1pbmcgVGFibGVzIGFuZCBGaWd1cmVzDQoNCiMjIyMgRmlndXJlIDExLiBTcHJpbmcgLSBPdmVyYWxsIENhcHR1cmUgVGltaW5nDQpgYGB7ciA1LiBDYXB0dXJlIFRpbWluZyAtIFNwcmluZyAtIE92ZXJhbGwgTWVkaWFuIENhcHR1cmUgVGltaW5nLCBmaWcuY2FwID0gIkZpZ3VyZSAxMS4gT3ZlcmFsbCBtZWRpYW4gc3ByaW5nIGNhcHR1cmUgdGltaW5nLiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDZ9DQpTcHJpbmcuQm94cGxvdC5GYWNldA0KYGBgDQoNCg0KIyMjIyBGaWd1cmUgMTIuIFNwcmluZyAtIERhaWx5IGNhcHR1cmVzIG9mIENDVCBwZXIgeWVhcg0KYGBge3IgNS4gQ2FwdHVyZSBUaW1pbmcgLSBTcHJpbmcgLSBEYWlseSBDVCBDYXB0dXJlcyBwZXIgeWVhciwgZmlnLmNhcCA9ICJGaWd1cmUgMTIuIFRvdGFsIGRhaWx5IGNhcHR1cmUgb2YgQ0NUIGFuZCBwcm9wb3J0aW9uIG9mIHRvdGFsIGFubnVhbCBjYXB0dXJlcy4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAyNX0NCg0KcHJpbnQoZGFpbHlfY2F0Y2hfcGxvdC5TcHJpbmcuQ1QpDQpgYGANCg0KIyMjIyBGaWd1cmUgMTMuIFNwcmluZyAtIFRvdGFsIGRhaWx5IGNhcHR1cmVzIG9mIENvaG8gU2FsbW9uIHBlciB5ZWFyDQpgYGB7ciA1LiBDYXB0dXJlIFRpbWluZyAtIFNwcmluZyAtIERhaWx5IENPIENhcHR1cmVzIHBlciB5ZWFyLCBmaWcuY2FwID0gIkZpZ3VyZSAxMy4gTnVtYmVyIG9mIENvaG8gU2FsbW9uIGNhcHR1cmVkIGR1cmluZyBlYWNoIGRheSBvZiBzcHJpbmcgZmVuY2Ugb3BlcmF0aW9uIHNpbmNlIDIwMDguIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMjV9DQoNCnByaW50KGRhaWx5X2NhdGNoX3Bsb3QuU3ByaW5nLkNPKQ0KYGBgDQoNCiMjIyMgRmlndXJlIDE0LiBGYWxsIC0gVG90YWwgZGFpbHkgY2FwdHVyZXMgb2YgQ29obyBTYWxtb24gcGVyIHllYXINCmBgYHtyIDUuIENhcHR1cmUgVGltaW5nIC0gRmFsbCAtIERhaWx5IENPIENhcHR1cmVzIHBlciB5ZWFyLCBmaWcuY2FwID0gIkZpZ3VyZSAxNC4gTnVtYmVyIG9mIENvaG8gU2FsbW9uIGNhcHR1cmVkIGR1cmluZyBlYWNoIGRheSBvZiBmYWxsIGZlbmNlIG9wZXJhdGlvbiBzaW5jZSAyMDA4LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDI1fQ0KDQpwcmludChkYWlseV9jYXRjaF9wbG90LkZhbGwuQ08pDQpgYGANCg0KIyMjIyBGaWd1cmUgMTUuIEZhbGwgLSBEYWlseSBjYXB0dXJlcyBvZiBDQ1QgcGVyIHllYXINCmBgYHtyIDUuIENhcHR1cmUgVGltaW5nIC0gRmFsbCAtIERhaWx5IENUIENhcHR1cmVzIHBlciB5ZWFyLCBmaWcuY2FwID0gIkZpZ3VyZSAxNS4gVG90YWwgZGFpbHkgY2FwdHVyZSBvZiBDQ1QgYW5kIHByb3BvcnRpb24gb2YgdG90YWwgYW5udWFsIGNhcHR1cmVzLiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDI1fQ0KDQpwcmludChkYWlseV9jYXRjaF9wbG90LkZhbGwuQ1QpDQpgYGANCg0KDQoNCg0KIyMgMi42IFdoYXQgYXJlIHRoZXNlIGZpc2ggZG9pbmc/Pz8NCmBgYHtyIDguIFNwcmluZyBTcGF3bmVycyAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQogc291cmNlKCJTb3VyY2VGaWxlcy84LiBTcHJpbmdTcGF3bmVycy5SIikNCmBgYA0KDQpDQ1Qgc2hvdyBpbmNyZWRpYmxlIGRpdmVyc2l0eSBpbiB0aGUgdGltaW5nIG9mIHRoZWlyIGxpZmUgaGlzdG9yeSBiZWhhdmlvdXJzLiBUaHJvdWdob3V0IHRoZWlyIHJhbmdlLCBzcGF3bmluZyBoYXMgYmVlbiBkb2N1bWVudGVkIGluIG5lYXJseSBldmVyeSBtb250aCBvZiB0aGUgeWVhci4gSW4gUHVnZXQgU291bmQgZm9yIGluc3RhbmNlLCBzcGF3bmluZyBoYXMgYmVlbiByZXBvcnRlZCBmcm9tIE5vdmVtYmVyIHRocm91Z2ggTWFyY2ggYW5kIHRpbWluZyBpcyBoaWdobHkgdmFyaWFibGUgYmV0d2VlbiB5ZWFycyAoW0xvc2VlIGV0IGFsLiAyMDE2XShodHRwczovL2Fmc3B1YnMub25saW5lbGlicmFyeS53aWxleS5jb20vZG9pL2Ficy8xMC4xMDgwLzAyNzU1OTQ3LjIwMTUuMTEyOTAwMSM6fjp0ZXh0PVRoZXNlJTIwdHlwZXMlMjBvZiUyMGRhdGElMjBoYXZlJTIwc3VnZ2VzdGVkJTIwYSxjb2FzdGFsJTIwc3RyZWFtJTIwb2YlMjBzb3V0aGVybiUyMFB1Z2V0JTIwU291bmQlMkMlMjBXYXNoaW5ndG9uLikpLiBUaGUgc3Bhd24gdGltaW5nIG9mIENDVCBpbiBTaW1tcyBDcmVlayBpcyB1bmtub3duLCBvciBhdCBsZWFzdCB1bmRvY3VtZW50ZWQsIGhvd2V2ZXIsIEkgd291bGQgYXNzdW1lIGl0IG9jY3VycyBkdXJpbmcgYSBzaW1pbGFyIHBlcmlvZCB0byBQdWdldCBTb3VuZCBhbmQgaXMgZXF1YWxseSB2YXJpYWJsZS4gDQoNClRoZSBjdXJyZW50IGRhdGFzZXQgZG9lcyBwcm92aWRlIHNvbWUgaW5zaWdodCBvbiBzcGF3biB0aW1pbmcuIFByZXN1bWFibHksIHNwYXduZXJzIHdpbGwgYmUgPjE1MCBtbSBpbiBsZW5ndGguDQoNCiMgRklOSVNIIFdSSVRJTkcgVEhJUyBTRUNUSU9ODQoNCg0KIyMgMy4gU3Vydml2YWwNCiMjIyAzLjEgV2hhdCBtYXkgYmUgZHJpdmluZyBqdXZlbmlsZSBhYnVuZGFuY2UNCmBgYHsgOS4gU3Vydml2YWwsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCnNvdXJjZSgiU291cmNlRmlsZXMvOS4gU3Vydml2YWwuUiIpDQpgYGANCg0KVG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBDb2hvIFNhbG1vbiB0aGF0IHN1cnZpdmUgZnJvbSBlZ2cgdG8gZnJ5LCB3ZSBuZWVkIHRvIG1ha2UgYSBudW1iZXIgb2YgYXNzdW1wdGlvbnM6DQoNCiAgICAtIEFsbCBhZHVsdCBDb2hvIFNhbG1vbiB0aGF0IGVudGVyIFNpbW1zIENyZWVrIGFuZCBhbGwganV2ZW5pbGUgQ29obyBTYWxtb24gdGhhdCBvdXRtaWdyYXRlIGZyb20gU2ltbXMgQ3JlZWsgYXJlIGVudW1lcmF0ZWQuICANCiAgICAtIEFsbCBhZHVsdCBDb2hvIFNhbG1vbiB0aGF0IHBhc3MgdGhlIGZlbmNlIHdpbGwgc3VjY2Vzc2Z1bGx5IHNwYXduLg0KICAgIC0gVGhlIHNleCByYXRpbyBvZiBhZHVsdHMgaXMgZXF1YWwgKDUwJSBhcmUgZmVtYWxlLCBleGNsdWRpbmcgamFja3Mgd2hpY2ggYXJlIGFzc3VtZWQgbWFsZSkuDQogICAgLSBFYWNoIGZlbWFsZSB3aWxsIGRlcG9zaXQgfjIsNjAwIGVnZ3MuDQoNCkltcG9ydGFudGx5LCB3ZSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgdGhlIHByb3BvcnRpb24gb2YganV2ZW5pbGVzIGZyb20gZWFjaCBhZ2UtY2xhc3MgdGhlIGVtaWdyYXRlIGVhY2ggeWVhciAoYW5kIGFzc3VtZSBqdXZlbmlsZSBhZ2UgYXNzaWdubWVudHMgYXJlIGFjY3VyYXRlKS4gRmlzaCB0aGF0IG91dG1pZ3JhdGUgYXMgQWdlLTAgZnJ5IHdpbGwgYmUgcHJvZ2VueSBvZiBmaXNoIHRoYXQgc3Bhd25lZCB0aGUgcHJldmlvdXMgZmFsbCwgd2hpbGUgZmlzaCB0aGF0IGVtaWdyYXRlIGF0IEFnZS0xIHdvdWxkIGhhdmUgc3BlbnQgYSBmdWxsIHllYXIgaW4gdGhlIHN0cmVhbSAoaS5lLiwgc3Bhd25lZCAyIGZhbGxzIHByZXZpb3VzKSBhbmQgQWdlLTErIGZpc2ggd291bGQgaGF2ZSBzcGF3bmVkIDMgeWVhcnMgcHJldmlvdXMuIFVzaW5nIHRoaXMgaW5mb3JtYXRpb24sIHdlIGNhbiB0aGVuIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGp1dmVuaWxlcyBwcm9kdWNlZCBieSBlYWNoIHNwYXduaW5nIGV2ZW50IHRvIGNhbGN1bGF0ZSBlZ2ctdG8tZnJ5IHN1cnZpdmFsLg0KDQoNCg0KIyMjIDMuMiBXaGF0IGFib3V0IG1hcmluZSBzdXJ2aXZhbCAoZnJvbSBzbW9sdCB0byBzcGF3bikNCg0KQWRkaXRpb25hbCBhc3N1bXB0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBqdXZlbmlsZXMgdGhhdCBzdXJ2aXZlIHRvIHJldHVybiBhcyBhZHVsdHM6DQoNCiAgICAtIEFkdWx0cyBzcGVuZCB+MTgtMjAgbW9udGhzIGF0IHNlYSAoMSB3aW50ZXIpLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBsZWF2ZSBTaW1tcyBDcmVlayBhcyBBZ2UtMCBvciBBZ2UtMS4NCiAgICAtIEphY2tzIHJldHVybiB0byBTaW1tcyBDcmVlayBhZnRlciB+Ni04IG1vbnRocyBhdCBzZWEgKDAgd2ludGVycykuIA0KICAgIC0gQWxsIENvaG8gU2FsbW9uIHRoYXQgYXJlIGVudW1lcmF0ZSBhdCB0aGUgZmVuY2Ugb3JpZ2luYXRlZCBmcm9tIFNpbW1zIENyZWVrIChpLmUuLCB0aGVyZSBhcmUgbm8gaGF0Y2hlcnkgZmlzaCBvciBzdHJheXMgZnJvbSBuZWlnaGJvdXJpbmcgc3RyZWFtcykuDQogICAgDQoNCg0KDQojIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmBgYHtyIGV4aXR9DQprbml0cjo6a25pdF9leGl0KCkNCmBgYA0KDQojIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmBgYHtyIENDVCAtIGN1bS5DYXRjaC5wbG90LGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOSwgZmlnLmhlaWdodCA9IDE1fQ0KDQpsYWJlbHMgPC0gZGF0YS5mcmFtZShZZWFyID0gdW5pcXVlKFNwcmluZy5DYXRjaCRZZWFyKSwgWVlZRUFSID0gdW5pcXVlKFNwcmluZy5DYXRjaCRZZWFyKSkgJT4lDQogICAgICAgICAgIyBkYXRhLmZyYW1lKFllYXIgPSB1bmlxdWUoQ0NUX2NhdGNoJFllYXIpLCBZWVlFQVIgPSB1bmlxdWUoQ0NUX2NhdGNoJFllYXIpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoWVlZRUFSID0gaWZlbHNlKFllYXIgPT0gMjAyMCwgIjIwMjAgLSBDT1ZJRCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWWVhciA9PSAyMDIxLCIyMDIxIC0gQ09WSUQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShZZWFyID09IDIwMjMsICIyMDIzIC0gU3RyaWtlIixZZWFyKSkpLA0KICAgICAgICAgICAgICAgICBsYWJYID0gYXMuRGF0ZShpZmVsc2UoWWVhciA9PSAyMDIwLCBhcy5EYXRlKCIyMDI0LTA1LTI1IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWWVhciA9PSAyMDIxLGFzLkRhdGUoIjIwMjQtMDUtMjUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWWVhciA9PSAyMDIzLCBhcy5EYXRlKCIyMDI0LTA1LTI1IiksYXMuRGF0ZSgiMjAyNC0wNC0xNiIpKSkpKSkNCmdncGxvdChTcHJpbmcuQ2F0Y2gpICsgDQogICAgICBnZW9tX2NvbChhZXMoeD0gZGF0ZS5zdGQsIHkgPWNhdGNoKSkrDQogICAgICBnZW9tX2xpbmUoYWVzKHg9IGRhdGUuc3RkLCB5ID0gcHJvcC5zY2FsZWQpKSArDQogICAgICBnZW9tX2xhYmVsKGRhdGEgPSBsYWJlbHMsIGFlcyhsYWJlbCA9IFlZWUVBUiksDQogICAgICAgICAgICAgICAgeCA9IGFzLkRhdGUoIjIwMjQtMDQtMTUiKSwgeSA9IDIwNSwNCiAgICAgICAgICAgICAgICBoanVzdCA9ICJsZWZ0Iiwgdmp1c3QgPSAwLA0KICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpKw0KICAgICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjIgd2VlayIsIGRhdGVfbGFiZWxzID0gIiViLSVkIikgKw0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKCJUb3RhbCBDYXB0dXJlcyAoIyBvZiBGaXNoKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmF4aXMgPSBzZWNfYXhpcyh+Li8zMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJvcG9ydGlvbiBvZiBUb3RhbCBDYXRjaCAoJSkiKSkrDQogICAgICBmYWNldF9ncmlkKFllYXJ+U3BlY2llcykgKw0KICAgICAgbGFicyh4PSIiLCB5ID0gIlRvdGFsIENhcHR1cmVzICgjIG9mIEZpc2gpIikgKw0KICAgICAgdGhlbWVfYncoKSArDQogICAgICB0aGVtZShzdHJpcC50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpDQogICAgDQpgYGANCg0KYGBge3IgQ0NUIC0gY3VtLkNhdGNoLnBsb3QyLGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSB9DQogICAgZ2dwbG90KENDVF9jYXRjaCkgKw0KICAgICAgICBnZW9tX2xpbmUoYWVzKHg9IGRhdGUuc3RkLCB5ID0gcHJvcCwgY29sb3IgPSBZZWFyKSkgKw0KICAgICAgICBsYWJzKHggPSAiIiwgeSA9ICJQcm9wb3J0aW9uIG9mIFRvdGFsIENhdGNoICglKSIpICsNCiAgICAgICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgd2VlayIsIA0KICAgICAgICAgICAgICAgICAgICAgbWlub3JfYnJlYWtzID0gIjEgZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgIGRhdGVfbGFiZWxzID0gJyViLSVkJykrIA0KICAgICAgICBmYWNldF9ncmlkKERlY2FkZX4uKSsNCiAgICAgICAgdGhlbWVfYncoKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQoNCg0KYGBgDQoNCmBgYHtyIENUIENhdGNoIFN1bW1hcnksIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMjIyBQcmVwIERhdGEgLS0tLQ0KQ1RfY2F0Y2ggPC0gY2F0Y2hfc3VtbWFyeSAlPiUNCiAgICAgICAgICAgIHNlbGVjdCgxOjEzKSAlPiUgICMgU2VsZWN0IENUIERhdGENCiAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBQZXJpb2QsIHZhbHVlc19mcm9tID0gMzoxMykgJT4lDQogICAgICAgICAgICBzZWxlY3QoMSwgZW5kc193aXRoKCJTcHJpbmciKSwgZW5kc193aXRoKCJGYWxsIikpICU+JQ0KICAgICAgICAgICAgdW5ncm91cCgpICU+JQ0KICAgICAgICAgICAgYWRkX3JvdyhZZWFyID0gYygyMDIwLCAyMDIxLCAyMDIzKSkgJT4lDQogICAgICAgICAgICBhcnJhbmdlKFllYXIpDQoNCg0KIyMgQ1QgS2FibGUgLS0tLQ0Ka2FibGUoQ1RfY2F0Y2gsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICBhbGlnbiA9IGMoImMiKSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlllYXIiLCJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCAgDQogICAgICAgICAgICAgICAgICAgICJuIiwiTWVkLiIsIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIsDQogICAgICAgICAgICAgICAgICAgICJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCAgDQogICAgICAgICAgICAgICAgICAgICJuIiwiTWVkLiIsIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIpLA0KICAgICAgY2FwdGlvbiA9ICIqKlRhYmxlIDEuIFNwcmluZyBhbmQgRmFsbCBUcmFwcGluZyBvZiBDQ1QuKioiLA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogICNjb2x1bW5fc3BlYyhjKDEsIDMsMTAsMTcpLCBib2xkID0gVFJVRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gIEZBTFNFLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSA9IDEyLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVFJVRSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MSwgIlNhbXBsZSBQZXJpb2QiID0gMywgIkNhcHR1cmUgVGltaW5nIiA9IDQsIkZvcmsgTGVuZ3RoIChtbSkiID0gNCwNCiAgICAgICAgICAgICAgICAgICAgICJTYW1wbGUgUGVyaW9kIiA9IDMsICJDYXB0dXJlIFRpbWluZyIgPSA0LCJGb3JrIExlbmd0aCAobW0pIiA9IDQpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsIlNwcmluZyIgPSAxMSwgIkZhbGwiID0gMTEpKSANCiANCmBgYA0KDQpgYGB7ciBDVCBTaXplIERpc3RyaWJ1dGlvbiwgbGVuZ3RoLWZyZXF1ZW5jeSBhbGwgeWVhcnMsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyMgTGVuZ3RoLUZyZXF1ZW5jeSBQbG90IG9mIGFsbCBDQ1QgY2FwdHVyZWQgdG8gZGF0ZS4NCiAgICAjIyBQcmVwYXJlIERhdGENCiAgICBDVF9kYXQgPC0gZGF0YV9hbGwgJT4lIA0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoU3BlY2llcyA9PSAiQ1QiKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGRhdGUuc3RkID0gIGNhc2Vfd2hlbih5ZWFyKERhdGUpID49IDAgfiAneWVhcjwtJyhEYXRlLCAyMDI0KSkpIA0KICAgICAgICAgICAgICAgICAgICANCg0KICAgICAgIyMgUHJlcGFyZSBQbG90DQogICAgICBhbGxfeWVhcnMucGxvdCA8LSBnZ3Bsb3QoQ1RfZGF0KSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBMZW5ndGgpLCBiaW53aWR0aCA9IDUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gIkZvcmsgTGVuZ2h0IChtbSkiLCB5ID0gIkZyZXF1ZW5jeSAoIyBGaXNoKSIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDUwLCA0NTAsIGJ5ID0gMjUpKSsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0NTAsIDUwKSkrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLjIsIGhqdXN0ID0gMSkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9idygpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNldF9ncmlkKFllYXJ+LikNCmBgYA0KDQpgYGB7ciBjb21wYXJlIHJlZ2lvbmFsIHRyZW5kcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyMgUHJlcCBSZWdpb25hbCBBYnVuZGFuY2UgRGF0YXNldA0KcmVnLmFidW5kIDwtIHJlZy5kYXQgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShkYXRhX3NldCA9ICJERk8iKSAlPiUNCiAgICAgICAgICAgICAgICBzZWxlY3QoZGF0YV9zZXQsIHllYXIsIHNwZWNpZXMsIHNwYXduZXJzLCBzbW9vdGhlZFNwYXduZXJzKSAlPiUNCiAgICAgICAgICAgICAgICByZW5hbWUoWWVhciAgICAgPSB5ZWFyLA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzICA9IHNwZWNpZXMsDQogICAgICAgICAgICAgICAgICAgICAgIG4gICAgICAgID0gc3Bhd25lcnMsDQogICAgICAgICAgICAgICAgICAgICAgIG5fc21vb3RoID0gc21vb3RoZWRTcGF3bmVycykgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShTcGVjaWVzID0gcmVjb2RlKGFzLmZhY3RvcihTcGVjaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29obyIgICAgICA9ICJDT19BZHVsdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5vb2siICAgPSAiQ04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaW5rIiAgICAgID0gIlBLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2h1bSIgICAgICA9ICJDTSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvY2tleWUiICAgPSAiU0siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGVlbGhlYWQiID0gIlNUIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPSBmYWN0b3IoU3BlY2llcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQ1QiLCJDT19BZHVsdCIsICJDTiIsIkNNIiwiUEsiLCAiU0siLCAiU1QiKSkpDQojIFByZXBhcmUgU2ltbXMgRGF0YSBhbmQgSm9pbiB3aXRoIFJlZ2lvbmFsIERhdGEgICAgICAgICAgICAgICAgDQpjYXRjaF9zcHJpbmcgPC0gZGF0YV9hbGwgJT4lDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihQZXJpb2QgPT0gIlNwcmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzICVpbiUgYygiQ1QiLCAiQ08iKSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFllYXIsU3BlY2llcykgJT4lDQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShTcGVjaWVzKSkgJT4lDQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShuX3Ntb290aCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NldCA9ICJTaW1tcyIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGUoZGF0YV9zZXQpICU+JQ0KICAgICAgICAgICAgICAgIHJiaW5kKHJlZy5hYnVuZCkNCg0KY2F0Y2hfc3ByaW5nX0NPIDwtIGNhdGNoX3NwcmluZyAlPiUNCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoWWVhciA+PSAyMDA4KSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoIW5fc21vb3RoKQ0KDQpnZ3Bsb3QoY2F0Y2hfc3ByaW5nX0NPLCANCiAgICAgICBhZXMoeCA9IFllYXIsIHkgPSBuKSkgKw0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKCkgKyANCiAgZmFjZXRfZ3JpZChTcGVjaWVzIH4uLCBzY2FsZXMgPSAiZnJlZSIpDQoNCmNhdGNoX3NwcmluZ19sb25nIDwtIGNhdGNoX3NwcmluZ19DTyAlPiUNCiAgICAgIHNlbGVjdCghZGF0YV9zZXQpICU+JQ0KICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFNwZWNpZXMsIHZhbHVlc19mcm9tID0gbikgJT4lDQogICAgICBkcm9wX25hKCkNCg0KY29yKGNhdGNoX3NwcmluZ19sb25nKQ0KYGBgDQoNCiMgMy4gRmFsbCBGZW5jZSBPcGVyYXRpb24NCiMjIyAzLjEuIE1vbml0b3JpbmcgRWZmb3J0DQoNCg0KDQo=